Xml 获取元素在XSLT中的实际位置
我想使用XSLT获得Xml 获取元素在XSLT中的实际位置,xml,xslt,Xml,Xslt,我想使用XSLT获得的实际位置 输入: <root> <p> <pPr> <pStyle val="EQsolutionlist1"/> </pPr> </p> <p> <pPr> <pStyle val="AAA"/> </pPr> <
的实际位置
输入:
<root>
<p>
<pPr>
<pStyle val="EQsolutionlist1"/>
</pPr>
</p>
<p>
<pPr>
<pStyle val="AAA"/>
</pPr>
</p>
<p>
<pPr>
<pStyle val="EQsolutionlist1"/>
</pPr>
</p>
</root>
输出应为:
<abc>
<q>1</q>
<q>2</q>
</abc>
1.
2.
试用代码:
<xsl:template match="p/pPr[pStyle[@val = 'EQsolutionlist1']]">
<abc>
<q>
<xsl:value-of select="ancestor::root//pPr[pStyle[val = 'EQsolutionlist1']]/position()"/>
</q>
</abc>
</xsl:template>
我得到的输出:
<abc>
<q>1 2</q>
<q>1 2</q>
</abc>
1 2
1 2
这意味着,在输入中有两个p[pPr[pStyle[@val='EQsolutionlist1']]]
。我想单独打印这个职位。作为我的代码,在输出中打印所有位置。我怎样才能解决这个问题
我使用XSLT 2
作为第一步,考虑做:
<xsl:template match="p/pPr[pStyle[@val = 'EQsolutionlist1']]">
<abc>
<q>
<xsl:value-of select="position()"/>
</q>
</abc>
</xsl:template>
但是,这并不完全正确,因为这里的position()
为您提供了xsl:apply templates所选节点集中节点的位置,而不是该节点在与此特定模板规则匹配的节点集中的位置
因此,您需要更改触发此模板规则的xsl:apply templates,以便它只选择要编号的节点:即,将谓词[pStyle[@val='EQsolutionlist1']
移动到xsl:apply templates
指令
请记住,position()
提供当前正在处理的项目序列中上下文项目的位置
如果在“/”的右侧使用position()
,如在A/position()
中所述,“/”表示对左侧表达式所选的每个项目对右侧表达式求值一次;“当前正在处理的项目序列”是由A选择的一组节点,其位置为1、2、3、。。。N其中N是表达式A选择的节点数。这根本不是您想要的
如果在模板规则的最外层代码中使用
position()
<xsl:template match="p/pPr[pStyle[@val = 'EQsolutionlist1']]">
<q>
<xsl:number count="pPr[pStyle[@val = 'EQsolutionlist1']]" level="any"/>
</q>
</xsl:template>
“//”运算符接受所有子体,而不是您所处的特定上下文元素。这就是为什么您总是得到每个指定节点作为答案的原因。您可以使用generate-id()函数来使用它,也可以简单地使用
XSLT1和XSLT2方法是将xsl:number
与正确的count
模式一起使用。在XSLT 3中,您也可以尝试使用累加器。@MartinHonnen我如何使用xsl:number
这个井,计算您需要计算的内容,文本说p
,代码似乎试图对pPr[pStyle[val='EQsolutionlist1']
,使用level=“any”
使用嵌套。基本上意味着它根据这些子对象的条件计算每个p。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="root">
<abc>
<xsl:apply-templates/>
</abc>
</xsl:template>
<xsl:template match="p/pPr[pStyle[@val = 'EQsolutionlist1']]">
<q>
<xsl:number count="pPr[pStyle[@val = 'EQsolutionlist1']]" level="any"/>
</q>
</xsl:template>
</xsl:stylesheet>