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实现)。