【问题标题】:From reference element, get count of preceding element occurrences within ancestor从参考元素中,获取祖先中先前元素出现的计数
【发布时间】:2012-05-12 06:11:07
【问题描述】:

我正在尝试根据对图的引用来确定当前章节中包含的图号。

要求:

  • 应为每章重置图号。
  • 图形参考,<figure_reference>,可能出现在任何深度。
  • XSLT 1.0

XML:

<top>
    <chapter>
        <dmodule>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
            <figure>figure</figure>
        </dmodule>
    </chapter>
    <chapter>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
            </paragraph>
        </dmodule>
        <dmodule>
            <figure>figure</figure>
            <paragraph>
                <figure>figure</figure>
                <paragraph>
                    <figure>figure</figure>
                </paragraph>
            </paragraph>
            <figure_reference id="c"/>
            <figure id="c">figure</figure>
        </dmodule>
    </chapter>
</top>

XSL:

<xsl:template match="figure_reference">
    <xsl:value-of select="count(ancestor::dmodule//figure[@id = current()/@id]/preceding::figure)+1"/>

</xsl:template>

当前计数结果: 8

想要的计数结果: 6

【问题讨论】:

    标签: xml xslt xpath xslt-1.0


    【解决方案1】:

    试试这个模板:

      <xsl:template match="figure_reference">
        <xsl:value-of select="count(ancestor::chapter//figure[@id=current()/@id]/preceding::figure[ancestor::chapter = current()/ancestor::chapter])+1"/>      
      </xsl:template>
    

    【讨论】:

      【解决方案2】:

      另一种不需要解析复杂 XPath 表达式的方法——使用&lt;xsl:number&gt;:

      <xsl:stylesheet version="1.0"
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
       <xsl:output omit-xml-declaration="yes" indent="yes"/>
       <xsl:key name="kFigById" match="figure" use="@id"/>
      
       <xsl:template match="figure_reference">
      
        <xsl:for-each select="key('kFigById', @id)">
            <xsl:number level="any" count="chapter//figure"
                      from="chapter"/>
        </xsl:for-each>
       </xsl:template>
      
       <xsl:template match="text()"/>
      </xsl:stylesheet>
      

      将此转换应用于提供的 XML 文档时:

      <top>
          <chapter>
              <dmodule>
                  <paragraph>
                      <figure>figure</figure>
                  </paragraph>
                  <figure>figure</figure>
              </dmodule>
          </chapter>
          <chapter>
              <dmodule>
                  <figure>figure</figure>
                  <paragraph>
                      <figure>figure</figure>
                  </paragraph>
              </dmodule>
              <dmodule>
                  <figure>figure</figure>
                  <paragraph>
                      <figure>figure</figure>
                      <paragraph>
                          <figure>figure</figure>
                      </paragraph>
                  </paragraph>
                  <figure_reference id="c"/>
                  <figure id="c">figure</figure>
              </dmodule>
          </chapter>
      </top>
      

      产生想要的正确结果

      6
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多