XSLT:如何在XML中的所有这些元素中获取元素的位置

时间:2018-01-04 07:20:27

标签: xml xslt

如何在XML文档中的所有此类元素中获取元素的位置/索引

例如,下面给出了XML:

<root>
    <fac></fac>
    <pac>
        <sec>a</sec>
        <sec>b</sec>
    </pac>
    <pac>
        <sec>c</sec>
        <sec>d</sec>
    </pac>
    <sec>e</sec>
</root>

在处理<pac>节点时,例如使用<xsl:for-each select="pac">,我需要在整个XML文档中获取<sec>节点的位置(无论级别如何)。所以,我希望获得每个<sec>的位置索引,如下所示:

<sec>a</sec> -> 1
<sec>b</sec> -> 2
<sec>c</sec> -> 3
<sec>d</sec> -> 4
<sec>e</sec> -> 5

使用position()函数,它返回相对于当前父级的位置。

2 个答案:

答案 0 :(得分:1)

您可以使用xsl:number level="any"例如

  <xsl:template match="sec">
      <xsl:copy>
          <xsl:attribute name="pos">
              <xsl:number level="any"/>
          </xsl:attribute>
          <xsl:apply-templates/>
      </xsl:copy>
  </xsl:template>

http://xsltfiddle.liberty-development.net/pPgCcom

答案 1 :(得分:0)

您可以改为使用android:paddingLeft="40dp" <Button android:id="@+id/goToPersonalPage" android:layout_width="145dp" android:layout_height="50dp" android:paddingLeft="40dp" android:layout_marginLeft="20dp" android:background="@drawable/button_oval" android:text="@string/memberButton" android:textColor="#29395e" android:textSize="18dp" />

count()

将样式表与输入XML一起使用时:

<xsl:value-of select="count(.|preceding::sec)"/>

它显示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output omit-xml-declaration="no" method="xml" indent="yes" />
    <xsl:strip-space elements="*"/>

    <xsl:strip-space elements="*"/>
    <xsl:output indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="sec">
        <xsl:copy-of select="."/>
        <xsl:value-of select="concat('[', count(.|preceding::sec), ']')"/>
    </xsl:template>

</xsl:stylesheet>