需要帮助来创建一个XSL文件,该文件将输入XML文件input.xml转换为output.xml的格式

时间:2014-06-05 15:56:01

标签: xml xslt

我需要:

  1. input.xml(下面的文件)转换为output.xml
  2. 的格式
  3. 创建另一个将按每个金额显示的XLS:KGPALM3 总价值;
  4. 将标记<quantity>替换为同一XSL中的标记<amount> 第2点;
  5. 创建另一个XSL,只为每个添加一个额外的标记<hour> <order>并在此代码中显示加载小时(hh:MM
  6. 但首先我需要转换此文件(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)转换为属性(如输出文件中的<PAL>...</PAL>) 。我环顾四周,尝试了一些东西,但它没有用。有人可以帮我弄这个吗。下面是我的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>
    

1 个答案:

答案 0 :(得分:2)

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

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>

请注意,我们假设每个订单每个单元的数量不超过一个(即不需要求和)。在我看来,目标结构没有你开始时那么有用。