xpath在xslt中没有按预期工作

时间:2015-07-31 07:49:16

标签: xml xslt xpath

我有以下xml

<myRequest>
    <id>123456789</id>
</myRequest>

我有以下xslt无法与输出

相同
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="xml" indent="yes" encoding="ISO-8859-1" version="1.0"
        omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="myRequest">
        <myRequest>
            <xsl:apply-templates select="id"/>
        </myRequest>
    </xsl:template>

    <xsl:template match="id">
        <customerId>
            <xsl:value-of select="id"/>
        </customerId>
    </xsl:template>

</xsl:stylesheet>

工作xslt

 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

    <xsl:output method="xml" indent="yes" encoding="ISO-8859-1" version="1.0"
        omit-xml-declaration="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="myRequest">
        <myRequest>
            <xsl:apply-templates select="//id"/>
        </myRequest>
    </xsl:template>

    <xsl:template match="id">
        <customerId>
            <xsl:value-of select="//id"/>
        </customerId>
    </xsl:template>

</xsl:stylesheet>

我把current()放在XWatch中,当调试指针在

时它也没有显示任何东西
<xsl:template match="myRequest">
            <myRequest>
..........................

为什么我需要在这里使用 // ?因为 id 元素直接位于 myRequest 下。我真的很困惑使用 / / 在这里?

不使用 // ,我们也需要获得输出。

我在这里做的错误是什么?

提前致谢...

1 个答案:

答案 0 :(得分:1)

您的第一个模板需要看起来像这样......

<xsl:template match="id">
    <customerId>
        <xsl:value-of select="."/>
    </customerId>
</xsl:template>

xsl:value-of中的表达式将相对于您所在的当前节点(id)节点,因此通过执行<xsl:value-of select="id" />,您正在查找名为{{1}的节点这是当前id元素的子元素。执行id获取当前节点的值。

执行.是有效的,因为当您使用//id启动表达式时,它将相对于顶级文档节点,然后执行/将搜索第一个//在文档中的任何地方。

请注意,请考虑在XSLT标识模板上构建XSLT,因为这将使其更通用,并且能够在文档中的任何位置更改id元素。

试试这个XSLT

id