【问题标题】:Need help to create an XSL file that will transform the input XML file input.xml to the format of output.xml需要帮助来创建将输入 XML 文件 input.xml 转换为 output.xml 格式的 XSL 文件
【发布时间】:2014-06-05 15:56:01
【问题描述】:

我需要:

  1. input.xml(下面的文件)转换为output.xml的格式
  2. 创建另一个将按每个金额显示的 XLS:KGPALM3 总值;
  3. 将标签 <quantity> 替换为同一 XSL 中的标签 <amount> 第 2 点;
  4. 创建另一个 XSL,它只是为每个 XSL 添加一个额外的标签 <hour> <order> 并在此标签内显示加载时间 (hh:MM)

但首先我需要转换这个文件(input.xml):

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
<orders>
    <order>
        <id>1</id>
        <number>10002</number>
        <type>Loading</type>
        <date>2013-01-01T02:30:00</date>
    </order>
    <order>
        <id>2</id>
        <number>10003</number>
        <type>Loading</type>
        <date>2013-01-01T010:30:00</date>
    </order>
    <order>
        <id>3</id>
        <number>10004</number>
        <type>Loaded</type>
        <date>2013-01-01T12:30:00</date>
    </order>
</orders>
<quantities>
    <quantity>
        <id_order>1</id_order>
        <unit>KG</unit>
        <value>1000</value>
    </quantity>
    <quantity>
        <id_order>1</id_order>
        <unit>PAL</unit>
        <value>3</value>
    </quantity>
    <quantity>
        <id_order>1</id_order>
        <unit>M3</unit>
        <value>1.5</value>
    </quantity>
    <quantity>
        <id_order>2</id_order>
        <unit>KG</unit>
        <value>2000</value>
    </quantity>
    <quantity>
        <id_order>2</id_order>
        <unit>PAL</unit>
        <value>4</value>
    </quantity>
    <quantity>
        <id_order>3</id_order>
        <unit>KG</unit>
        <value>5000</value> 
    </quantity>
</quantities>
</output>

到这个文件(output.xml):

<?xml version="1.0" encoding="ISO-8859-1"?>
<output>
<orders>
    <order>
        <id>1</id>
        <number>10002</number>
        <type>Loading</type>
        <KG>1000</KG>
        <PAL>3</PAL>
        <M3>1.5</M3>
    </order>
    <order>
        <id>2</id>
        <number>10003</number>
        <type>Loading</type>
        <KG>2000</KG>
        <PAL>4</PAL>
    </order>
    <order>
        <id>3</id>
        <number>10004</number>
        <type>Loaded</type>
        <KG>5000</KG>
    </order>
</orders>
</output>

我试过这个但它不完整,我不知道如何将值(如:输入文件中的PAL)转换为属性(如输出文件中的&lt;PAL&gt;...&lt;/PAL&gt;)。我环顾四周并尝试了几件事,但它不起作用。有人可以帮我弄这个吗。下面是我的 XSLT。提前致谢。

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>

<xsl: template match = "/">
    <output>
            <xsl: for-each select = "orders/order[id = 1]">
            <order>
                    <xsl: value-of select = "id"/>
                    <xsl: value-of select = "number"/>
                    <xsl: value-of select = "type"/>
            </order>
            </xsl: for-each>
            <xsl: for-each select = "quantities/quantity">
            <order>
                    <xsl: value-of select = "id"/>
                    <xsl: value-of select = "number"/>
                    <xsl: value-of select = "type"/>
            </order>
            </xsl: for-each>
    </output>

【问题讨论】:

标签: xml xslt


【解决方案1】:

您需要通过匹配订单 ID 将数量链接到各自的订单。最好的方法是使用 key

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="qty" match="quantity" use="id_order"/>  

<xsl:template match="/">
<output>
    <orders>
        <xsl:for-each select="output/orders/order"> 
            <order>
                <xsl:copy-of select="id|number|type"/>
                <xsl:for-each select="key('qty', id)">
                    <xsl:element name="{unit}">
                        <xsl:value-of select="value"/>  
                    </xsl:element>
                </xsl:for-each>
            </order>    
        </xsl:for-each>
    </orders>
</output>
</xsl:template>

</xsl:stylesheet>

请注意,我们假设每个订单的每个单位数量不超过一个(即不需要求和)。此外,在我看来,目标结构不如您开始使用的有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多