转换xslt不转换所有元素

时间:2016-06-23 23:37:43

标签: xslt

我正在将xml文件导入Access,并使用xslt文件转换文件以包含每个部分的orderNumber。不确定正确的用语。 在下面的代码中,我获取了为项目添加的字段和orderNumber,以及其他部分的字段,shippingAddress,payment等。

我不太明白我是否需要进行更改才能将orderNumber的数据添加到字段中。

非常感谢任何帮助。

格雷格

这是我给予的工作。

 <?xml version="1.0" encoding="UTF-8"?>
-<orders xmlns:php="http://php.net/xsl">
-<order>
        <orderNumber>100000379</orderNumber>
-<billingAddress>
            <company>Acme</company>
            <name>John Doe</name>
            <address1>59 Any St</address1>
            <address2/>
            <city>New York</city>
            <state>NY</state>
            <zip>10013-4020</zip>
            <country>US</country>
            <phone>212-555-1212</phone>
        </billingAddress>
-<shippingAddress>
            <company>Acme</company>
            <name>John Doe</name>
            <address1>59 Any St</address1>
            <address2/>
            <city>New York</city>
            <state>NY</state>
            <zip>10013-4020</zip>
            <country>US</country>
            <phone>212-555-1212</phone>
        </shippingAddress>
        <createdOn>2016-06-22 14:38:06</createdOn>
        <shipMethod>ups_GND</shipMethod>
        <shipDescription>United Parcel Service - Ground</shipDescription>
-<payment>
            <tax>0</tax>
            <shipmentCost>26.76</shipmentCost>
            <subtotalExclTax>1616</subtotalExclTax>
            <subtotalInclTax>1616</subtotalInclTax>
            <discount>0</discount>
            <grandTotal>1642.76</grandTotal>
            <paymentMethod>purchaseorder</paymentMethod>
        </payment>
-<items>
-<item>
                <itemId>645</itemId>
                <productId>171</productId>
                <sku>12749</sku>
                <qty>1</qty>
                <price>858</price>
                <tax>0</tax>
                <itemTotal>858</itemTotal>
            </item>
-<item>
                <itemId>646</itemId>
                <productId>178</productId>
                <sku>127478</sku>
                <qty>1</qty>
                <price>758</price>
                <tax>0</tax>
                <itemTotal>758</itemTotal>
            </item>
        </items>
    </order>
</orders>

这是xslt代码。我发现这是一个例子,但我似乎无法使其发挥作用。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
    <dataroot>
        <xsl:apply-templates select="@*|node()"/>

    </dataroot>
</xsl:template>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>

    </xsl:copy>
</xsl:template>

<xsl:template match="billingAddress">
    <billingAddress>
        <orderNumber><xsl:value-of select="../../orderNumber"/></orderNumber>
        <xsl:apply-templates select="node()"/>
    </billingAddress>
</xsl:template>

<xsl:template match="shippingAddress">
    <shippingAddress>
        <orderNumber><xsl:value-of select="../../orderNumber"/></orderNumber>
        <xsl:apply-templates select="node()"/>
    </shippingAddress>
</xsl:template>

<xsl:template match="payment">
    <payment>
        <orderNumber><xsl:value-of select="../../orderNumber"/></orderNumber>
        <xsl:apply-templates select="node()"/>
    </payment>
</xsl:template>

<xsl:template match="items">
    <xsl:apply-templates select="@*|node()"/>
</xsl:template>

 <xsl:template match="item">
    <item>
        <orderNumber><xsl:value-of select="../../orderNumber"/></orderNumber>
        <xsl:apply-templates select="@*|node()"/>
    </item>
</xsl:template>

1 个答案:

答案 0 :(得分:0)

<orderNumber>元素是<billingAddress><shippingAddress><payment>的兄弟,但高于<items>。因此,您的上下文级别指令../../仅适用于<item>节点。

简单地替换:

<xsl:value-of select="../../orderNumber"/>

使用公共表达式<order>是所有必需节点的祖先:

<xsl:value-of select="ancestor::order/orderNumber"/>