使用xlst来计算中间元素

时间:2016-10-21 12:57:27

标签: xslt

我如何计算中间元素?我认为解决方案与this question有关。假设我有这样的事情:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <row>
    <cell>Title</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
    <cell>example additional cell</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
  <row>
    <cell>Title</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
  <row>
    <cell>Title</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
  <row>
    <cell>Title</cell>
  </row>
  <row>
    <cell padding='true'>Chapter</cell>
  </row>
</root>

然后,应用这样的转换:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="2.0">
<xsl:template match="/root">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="row">
    <xsl:choose>
        <!--these are the indented ones-->
        <xsl:when test="cell/@padding">
        <xsl:number
                value="count(preceding-sibling::row[child::cell[1][@padding]]) + 1"
                format="a.&#x20;"/>
        </xsl:when>
        <xsl:otherwise>
        <xsl:number
                value="count(preceding-sibling::row[child::cell[1][not(@padding)]]) + 1"
                format="1.&#x20;"/>
        </xsl:otherwise>
    </xsl:choose>
    <xsl:value-of select="cell/text()"/>
</xsl:template>

</xsl:stylesheet>

我得到了这个结果:

1. Title
  a. Chapter
  b. Chapter
  c. Chapter
2. Title
  d. Chapter
3. Title
  e. Chapter
  f. Chapter
4. Title
  g. Chapter

我想要的是让“子”项重新开始编号。我无法想象如何改变轴以停止回顾早期的元素。

我希望计算“章节”。所以:

1. Title
  a. Chapter
  b. Chapter
  c. Chapter
2. Title
  a. Chapter
3. Title
  a. Chapter
  b. Chapter
4. Title
  a. Chapter

1 个答案:

答案 0 :(得分:0)

我建议你这样试试:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />
<xsl:strip-space elements="*"/>

<xsl:template match="/root">
    <xsl:apply-templates select="row[not(cell/@padding)] | row/cell[@padding]"/>
</xsl:template>

<xsl:template match="row">
    <xsl:number count="row[not(cell/@padding)]" format="1. "/>
    <xsl:value-of select="cell"/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="cell">
    <xsl:number count="cell[@padding]" level="any" from="row[not(cell/@padding)]" format="   a. "/>
    <xsl:value-of select="."/>
    <xsl:text>&#10;</xsl:text>
</xsl:template>

</xsl:stylesheet>