Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 如何在xslt中为变量使用xpath?_Xml_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

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

Xml 如何在xslt中为变量使用xpath?,xml,xslt,xpath,xslt-2.0,Xml,Xslt,Xpath,Xslt 2.0,例如,我有一个变量$myVar,它等于: <ResultSet> <Row> <Cell name="NEXTVAL" type="NUMBER">475535</Cell> </Row> <Row> <Cell name="NEXTVAL" type="NUMBER">475536</Cell> </Row> <

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

475535
475536
475537
如何在xslt中为该变量使用xpath

就像在
/ResultSet/Row[1]/Cell
中以某种方式获取值一样,找到了解决方案


吉尔卡
科塞克
jirka@kosek.cz
现在假设我们想从$author变量中提取电子邮件地址。最明显的方法是使用诸如$author/email之类的表达式。但这将失败,因为您无法将XPath导航应用于“result tree fragment”类型的变量

如果我们想绕过这个限制,我们可以使用一个扩展函数,它能够将结果树片段转换回节点集。此函数不是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>

...
...

第一行将匹配结果集作为模板。。。 下一行将仅显示行值

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

 '<xsl:value-of select="/ResultSet/Row[1]/Cell"/> '
“”
请参考学习XPath

让我知道这会解决你的问题

谢谢


如果变量是这样形成的,则Pavan

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

475535
475536
475537
那么您的xpath应该如下所示

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

您的变量位于ResultSet节点上,所以您不想使用$myVar/ResultSet,因为在该级别上只有行节点。 注意,您需要将变量设置为element(“as”属性)。 如果您的名称空间是相关的,并且某些变量具有与其他变量不同的默认名称空间,那么您可以像下面这样为这个xpath表达式设置默认名称空间

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

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

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


请澄清您的要求。实际上,您定义的$myvar也很重要,在xsl中创建一个变量将创建一个变量。您将问题标记为xslt-2.0,在xslt 2.0中没有结果树片段(只是与主输入树具有相同数据类型的临时树)XSLT2.0中不再需要将结果树片段转换为节点集的扩展函数。因此,给定XSLT2.0和
xsl:variable
,您应该能够很好地使用
$author/email
。常见的XSLT2.0处理器有Saxon 9(Java和.NET版本)、XmlPrime(纯.NET版本)和AltovaXML(基于COM的Windows实现)。