Xml 获取元素在XSLT中的实际位置

Xml 获取元素在XSLT中的实际位置,xml,xslt,Xml,Xslt,我想使用XSLT获得的实际位置 输入: <root> <p> <pPr> <pStyle val="EQsolutionlist1"/> </pPr> </p> <p> <pPr> <pStyle val="AAA"/> </pPr> <

我想使用XSLT获得
的实际位置

输入:

<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>