Как посчитать расценки в разделе - PullRequest
0 голосов
/ 06 февраля 2020

Подсчет нескольких диспутов в разделе, если счетчик дисп> 1 в разделе, тогда ПРИМЕР S / B ПРИМЕР 1 Если я запускаю этот XSLT, генерируем число в одном диспле -цитат

Ввод

    <?xml version="1.0" encoding="UTF-8"?>
<book>
    <sec id="ceb_6511034722757hl" disp-level="1" specific-use="15.1"><label>15.1 </label><title>I.  OVERVIEW</title>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
    </sec>
    <sec id="ceb_6511034722757hl" disp-level="1" specific-use="15.2"><label>15.2 </label><title>I.  Employer</title>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
    </sec>
</book>

Ожидаемый результат

    <?xml version="1.0" encoding="UTF-8"?><book>
    <sec id="ceb_6511034722757hl" disp-level="1" specific-use="15.1"><label>15.1 </label><title>I.  OVERVIEW</title>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE</bold> An employer notices.</p>
        </disp-quote>
    </sec>
    <sec id="ceb_6511034722757hl" disp-level="1" specific-use="15.2"><label>15.2 </label><title>I.  Employer</title>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE 1</bold> An employer notices.</p>
        </disp-quote>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE 2</bold> An employer notices.</p>
        </disp-quote>
        <p content-type="new">This chapter provides</p>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE 3</bold> An employer notices.</p>
        </disp-quote>
        <disp-quote>
            <p content-type="example"><bold>EXAMPLE 4</bold> An employer notices.</p>
        </disp-quote>
    </sec>
</book>

XSLT

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="xml" omit-xml-declaration="no"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="disp-quote//bold[.='EXAMPLE']">
        <bold>
            <xsl:value-of select="."/>
            <xsl:number level="any" count="bold" from="sec" format=" 1"/>
        </bold>
    </xsl:template>
</xsl:stylesheet>

Подсчет нескольких диспутов в разделе, если счетчик дисп> 1 в разделе, тогда ПРИМЕР S / B ПРИМЕР 1 Если я запустил этот XSLT, то сгенерируйте число в едином кавычке.

1 Ответ

1 голос
/ 06 февраля 2020

В XSLT 3 вы можете использовать аккумулятор:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    expand-text="yes"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy" use-accumulators="#all"/>

  <xsl:output indent="yes"/>

  <xsl:accumulator name="disp-quote-count" as="xs:integer" initial-value="0">
      <xsl:accumulator-rule match="sec" select="0"/>
      <xsl:accumulator-rule match="sec/disp-quote" select="$value + 1"/>
  </xsl:accumulator>

  <xsl:template match="sec[accumulator-after('disp-quote-count') > 1]/disp-quote//bold[. = 'EXAMPLE']">
      <xsl:copy>{.} {accumulator-before('disp-quote-count')}</xsl:copy>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bwe3bW/2

Или в XSLT 2 сосчитать disp-quote детей в шаблоне совпадения и совпадают, только если их хотя бы два:

  <xsl:template match="sec[disp-quote[2]]/disp-quote//bold[. = 'EXAMPLE']">
      <xsl:copy>
            <xsl:value-of select="."/>
            <xsl:number level="any" count="bold" from="sec" format=" 1"/>
      </xsl:copy>
  </xsl:template>

https://xsltfiddle.liberty-development.net/bwe3bW/3

...