【问题标题】:How to use xpath for variable in xslt?如何在xslt中使用xpath作为变量?
【发布时间】:2012-12-26 06:42:56
【问题描述】:

例如,我有一个变量$myVar 等于:

<ResultSet>
    <Row>
        <Cell name="NEXTVAL" type="NUMBER">475535</Cell>
    </Row>
    <Row>
        <Cell name="NEXTVAL" type="NUMBER">475536</Cell>
    </Row>
    <Row>
        <Cell name="NEXTVAL" type="NUMBER">475537</Cell>
    </Row>
</ResultSet>

如何在 xslt 中为这个变量使用 xpath?

就像以某种方式在/ResultSet/Row[1]/Cell 中获得价值

【问题讨论】:

    标签: xml xslt xpath xslt-2.0


    【解决方案1】:

    如果你的变量是这样形成的

    <xsl:variable name="myVar" as="element()">
        <ResultSet>
            <Row>
                <Cell name="NEXTVAL" type="NUMBER">475535</Cell>
            </Row>
            <Row>
                <Cell name="NEXTVAL" type="NUMBER">475536</Cell>
            </Row>
            <Row>
                <Cell name="NEXTVAL" type="NUMBER">475537</Cell>
            </Row>
        </ResultSet>
    </xsl:variable>
    

    那么你的 xpath 应该是这样的

    <xsl:sequence select="$myVar/Row[1]/Cell"/>
    

    您的变量在 ResultSet 节点上“站立”,因此您不想使用 $myVar/ResultSet 因为在该级别上只有 Row 节点。 请注意,您需要将变量设置为元素(“as”属性)。 如果您的命名空间是相关的,并且某些变量的默认命名空间与其他变量不同,您可以像这样为这个 xpath 表达式设置默认命名空间

    <xsl:sequence select="$myVar/Row[1]/Cell" xpath-default-namespace="http://something.com"/>
    

    您还可以为整个样式表设置默认命名空间。 如果你想忽略命名空间,你可以像这样使用 xpath

    <xsl:sequence select="$myVar/*:Row[1]/*:Cell"/>
    

    【讨论】:

      【解决方案2】:

      找到解决方案here

      <xsl:variable name="author">
        <firstname>Jirka</firstname>
        <surname>Kosek</surname>
        <email>jirka@kosek.cz</email>
      </xsl:variable>
      

      现在假设我们要从 $author 变量中提取电子邮件地址。最明显的方法是使用诸如 $author/email 之类的表达式。但这会失败,因为您不能将 XPath 导航应用于“结果树片段”类型的变量。

      如果我们想绕过这个限制,我们可以使用一个扩展函数,它能够将结果树片段转换回节点集。此函数不是 XSLT 或 XPath 标准的一部分;因此,使用它的样式表不会像不使用它的样式表那样可移植。然而,node-set() 的优势通常超过可移植性问题。

      扩展函数始终位于单独的命名空间中。为了使用它们,我们必须在样式表中将此命名空间声明为扩展命名空间。每个处理器实现 node-set() 函数的命名空间都不同,但幸运的是许多处理器也支持 EXSLT,因此我们可以在样式表的开头使用以下声明。

      <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                      xmlns:exsl="http://exslt.org/common"
                      extension-element-prefixes="exsl"
                      version="1.0">
        ...
        <!-- Now we can convert result tree fragment back to node-set -->
        <xsl:value-of select="exsl:node-set($author)/email"/>
        ...
      </xsl:stylesheet>
      

      【讨论】:

      • 您已将您的问题标记为 xslt-2.0 并且使用 XSLT 2.0 没有结果树片段(只是与主输入树具有相同数据类型的临时树)和一个用于转换结果的扩展函数在 XSLT 2.0 中不再需要将树片段放入节点集。所以给定带有xsl:variable 的XSLT 2.0,你应该可以使用$author/email 就好了。常见的 XSLT 2.0 处理器是 Saxon 9(提供 Java 和 .NET 版本)、XmlPrime(纯 .NET 版本)和 AltovaXML(基于 COM 的 Windows 实现)。
      【解决方案3】:

      第一行将匹配 ResultSet 作为模板... 下一行将只显示 row1

      '<xsl:template match="//ResultSet">
       <xsl:value-of select="/ResultSet/Row[1]/Cell"/>'
      

      此单曲还返回 475535 作为输出。

       '<xsl:value-of select="/ResultSet/Row[1]/Cell"/> '
      

      请参考XPATH学习Xpaths

      让我知道这将解决您的问题。

      谢谢,

      帕万

      【讨论】:

      • 请说明您的要求。实际上,您定义的 $myvar 也很重要,在 xsl 中创建一个变量将创建一个变量。
      猜你喜欢
      • 2012-04-09
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2023-01-21
      • 2016-10-05
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多