3

例如,我有一个变量$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

4

3 回答 3

2

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

<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"/>
于 2012-12-26T10:57:28.217 回答
0

在这里找到解决方案

<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>
于 2012-12-26T07:46:06.107 回答
-1

第一行将匹配 ResultSet 作为模板...下一行将仅显示第1行的 值

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

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

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

请参考XPATH来学习 Xpaths

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

谢谢,

帕万

于 2012-12-26T07:47:08.250 回答