XSLT不会相应地操纵XML文件

时间:2010-09-28 22:31:36

标签: xml xslt

这是XML文件:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="LabXSLT.xslt"?>
<orders>
    <order>
        <customerid>2364</customerid>
        <status>pending</status>
        <item instock="Y" itemid="SD93">
            <name>Flying By Roller Skates</name>
            <price>25.00</price>
            <qty>25</qty>
        </item>
        <item instock="N" itemid="B12">
            <name>Bounce-o Ball</name>
            <price>.35</price>
            <qty>150</qty>
        </item>
    </order>
    <order>
        <customerid>5268</customerid>
        <status>complete</status>
        <item instock="Y" itemid="Q52">
            <name>Crash N Burn Skis</name>
            <price>20</price>
            <qty>10</qty>
        </item>
    </order>
</orders>

XSLT文件:

<xsl:for-each select="orders/order">
    <p>Customer Number:</p>
    <xsl:value-of select="customerid" />
    <p>Name:</p>
    <xsl:value-of select="name" />
</xsl:for-each>

XSLT文件假设获取custeomrID和name并显示它。它获取customerID但不获取名称。它只剩下空白,看起来它只能到达两个名称元素。我认为其中一个问题是元素中有2个元素。不知道该怎么做。我也无法更改XML文件。

6 个答案:

答案 0 :(得分:2)

有时可以帮助修复XML上的缩进,以便更清楚地看到层次结构:

<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="LabXSLT.xslt"?>
<orders>
    <order>
        <customerid>2364</customerid>
        <status>pending</status>
        <item instock="Y" itemid="SD93">
            <name>Flying By Roller Skates</name>
            <price>25.00</price>
            <qty>25</qty>
        </item>
        <item instock="N" itemid="B12">
            <name>Bounce-o Ball</name>
            <price>.35</price>
            <qty>150</qty>
        </item>
    </order>
    <order>
        <customerid>5268</customerid>
        <status>complete</status>
        <item instock="Y" itemid="Q52">
            <name>Crash N Burn Skis</name>
            <price>20</price>
            <qty>10</qty>
        </item>
    </order>
</orders>

这样可以更容易地看到您需要定位item/name

编辑:要访问订单节点中的每个项目,您的XSL可能如下所示:

<xsl:for-each select="orders/order">
    <p>Customer Number:</p>
    <xsl:value-of select="customerid" />
    <xsl:for-each select="item">
        <p>Name:</p>
        <xsl:value-of select="name" />
    </xsl:for-each>
</xsl:for-each>

答案 1 :(得分:0)

name元素是项目的子元素。它似乎不是客户名称元素。这是你想要做的,还是你想要项目名称?

答案 2 :(得分:0)

name标记位于item标记内。那么当一个客户有多个名字时应该怎么办?

答案 3 :(得分:0)

因为名称位于标签项

你的代码应该打印名称

<xsl: value-of select ="item/name"/>

答案 4 :(得分:0)

同样@Casey说的。但是,如果您使用

<xsl:value-of select="item/name" />

您只会获得第一个项目的名称,因为这是<xsl:value-of>的作用。根据您的要求,您可能需要更改它。

答案 5 :(得分:0)

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="customerid|name">
        <p>
            <xsl:apply-templates/>
        </p>
    </xsl:template>
    <xsl:template match="customerid/text()">
        <xsl:value-of select="concat('Customer Number: ',.)"/>
    </xsl:template>
    <xsl:template match="name/text()">
        <xsl:value-of select="concat('Name: ',.)"/>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

输出:

<p>Customer Number: 2364</p>
<p>Name: Flying By Roller Skates</p>
<p>Name: Bounce-o Ball</p>
<p>Customer Number: 5268</p>
<p>Name: Crash N Burn Skis</p>

注意:拉动样式,模式匹配。