首页 > 解决方案 > 使用 XSLT 2.0 计算不同标签内的标签

问题描述

我有一个如下所示的 XML 文件:

<tier_list>
  <tier>
    <status_list>
      <status>
        <b_list>
          <b>test1</b>
          <b>test2</b>
        </b_list>
      </status>
      <status>
        <b_list>
          <b>test3</b>
          <b>test4</b>
        </b_list>
      </status>
    <status_list>
   <tier>
  <tier>
    <status_list>
      <status>
        <b_list>
          <b>testest</b>
        </b_list>
      </status>
      <status>
        <b_list>
          <b>abc</b>
        </b_list>
      </status>
    <status_list>
   <tier>
</tier_list>

我使用 XSLT 2.0 将此文件转换为 csv 文件。有没有办法生成一个数字,计算层标签内的每个 b 标签(忽略状态标签)?

所以我会得到这样的结果:

1;test1
2;test2
3;test3
4;test4
1;testtest
2;abc

标签: xmlxsltxslt-2.0

解决方案


恕我直言,最简单的解决方案是嵌套两条xsl:for-each指令,以便每次重新开始计数tier。然后使用该position()函数在内部提供编号xsl:for-each

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="tier_list">
    <xsl:for-each select="tier">
        <xsl:for-each select="status_list/status/b_list/b">
            <xsl:value-of select="position()"/>
            <xsl:text>;</xsl:text>  
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

或者,您可以使用xsl:number

<xsl:number level="any" from="tier" format="1;"/>

演示(使用您输入的更正(!)版本):https ://xsltfiddle.liberty-development.net/bFWRApq


推荐阅读