XLS Создать новый элемент, если условие соответствует - PullRequest
1 голос
/ 10 ноября 2019

Я получаю эту ошибку:

Тип элемента "xsl: if" должен заканчиваться соответствующим конечным тегом ""

когда я 'я пытаюсь закрыть и открыть новый fo:block, если выполняется определенное условие.

<xsl:if test=".[@pdf_break='true']">
        </fo:block><fo:block>
</xsl:if>

Как это должно быть написано?

Полный пример того, что я пытаюсь сделать:

<fo:block>
<xsl:for-each select="/article/front/article-meta/contrib-group/contrib[@contrib-type='author']">
    <fo:basic-link show-destination="new" external-destination="url({$link})" >
        <fo:inline>&#160;<xsl:value-of select="name/given-names" />&#160;<xsl:value-of select="name/surname" />&#160;<fo:inline font-size="8pt" vertical-align="super" font-family="HelveticaNeueLTCom-Lt_1" padding-right="8pt" padding-left="-8pt"><xsl:for-each select="xref[@ref-type='aff']"><xsl:value-of select="sup" /><xsl:if test="position()!=last()">,</xsl:if></xsl:for-each></fo:inline></fo:inline>
    </fo:basic-link>
    <xsl:if test=".[@pdf_break='true']">
        </fo:block><fo:block>
    </xsl:if>
</xsl:for-each>

, поэтому в основном это должно быть:

<fo:block>
Some amount of authors listed with links
</fo:block>

, когда pdf_break никогда не бывает true, а затем:

<fo:block>
Some amount of authors listed with links
</fo:block>
<fo:block>
More authors listed with links
</fo:block>

когда атрибут true.

Пример XML:

<contrib-group>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='false'>
        <name>
            <surnameExample1</surname>
            <given-names>Example1</given-names>
        </name>
        <xref ref-type='aff' rid='ID1'><sup>1</sup></xref>
    </contrib>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example2</surname>
            <given-names>Example2</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
        <xref ref-type='aff' rid='ID3'><sup>3</sup></xref>
        <xref ref-type='aff' rid='ID4'><sup>4</sup></xref>
        <xref ref-type='aff' rid='ID5'><sup>5</sup></xref>
    </contrib>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='true'>
        <name>
            <surname>Example3</surname>
            <given-names>Example3</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
    </contrib>
    <contrib contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example4</surname>
            <given-names>Example4</given-names>
        </name>
        <xref ref-type='aff' rid='ID6'><sup>6</sup></xref>
    </contrib>
    <contrib contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example5</surname>
            <given-names>Example15</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
    </contrib>
</contrib-group>

Ответы [ 2 ]

1 голос
/ 10 ноября 2019

Использование:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/*">
   <doc xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:for-each-group select="contrib" group-ending-with="contrib[@pdf_break = 'true']">
      <fo:block>
         <xsl:for-each select="current-group()">
           <author><xsl:sequence select="name/surname, name/given-names"/></author>
         </xsl:for-each>
      </fo:block>
    </xsl:for-each-group>
    </doc>
  </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному документу XML:

<contrib-group>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example1</surname>
            <given-names>Example1</given-names>
        </name>
        <xref ref-type='aff' rid='ID1'><sup>1</sup></xref>
    </contrib>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example2</surname>
            <given-names>Example2</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
        <xref ref-type='aff' rid='ID3'><sup>3</sup></xref>
        <xref ref-type='aff' rid='ID4'><sup>4</sup></xref>
        <xref ref-type='aff' rid='ID5'><sup>5</sup></xref>
    </contrib>
    <contrib equal-contrib="yes" contrib-type='author' pdf_break='true'>
        <name>
            <surname>Example3</surname>
            <given-names>Example3</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
    </contrib>
    <contrib contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example4</surname>
            <given-names>Example4</given-names>
        </name>
        <xref ref-type='aff' rid='ID6'><sup>6</sup></xref>
    </contrib>
    <contrib contrib-type='author' pdf_break='false'>
        <name>
            <surname>Example5</surname>
            <given-names>Example15</given-names>
        </name>
        <xref ref-type='aff' rid='ID2'><sup>2</sup></xref>
    </contrib>
</contrib-group>

создается искомый структурированный вывод:

<doc xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <fo:block>
      <author>
         <surname>Example1</surname>
         <given-names>Example1</given-names>
      </author>
      <author>
         <surname>Example2</surname>
         <given-names>Example2</given-names>
      </author>
      <author>
         <surname>Example3</surname>
         <given-names>Example3</given-names>
      </author>
   </fo:block>
   <fo:block>
      <author>
         <surname>Example4</surname>
         <given-names>Example4</given-names>
      </author>
      <author>
         <surname>Example5</surname>
         <given-names>Example15</given-names>
      </author>
   </fo:block>
</doc>

XSLT 1.0 решение:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:fo="http://www.w3.org/1999/XSL/Format">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:key name="kInGroup" match="contrib" 
          use="generate-id(preceding-sibling::contrib[@pdf_break = 'true'][1])"/>

  <xsl:template match=
     "contrib[generate-id()
             = generate-id(key('kInGroup',
                                generate-id(preceding-sibling::contrib[@pdf_break='true']
                                                                                 [1]
                              )
                           )[1]
                         )
             ]">
    <fo:block>
      <xsl:apply-templates mode="inGroup" select=
      "key('kInGroup',
            generate-id(preceding-sibling::contrib[@pdf_break = 'true'][1])
           )"/>
    </fo:block>
  </xsl:template>

  <xsl:template match="contrib" mode="inGroup">
     <author><xsl:copy-of select="name/*"/></author>
  </xsl:template>

  <xsl:template match="text()"/>
</xsl:stylesheet>

При применении к одному и тому же XMLдокумент (выше), снова выдается корректно структурированный вывод :

<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <author>
      <surname>Example1</surname>
      <given-names>Example1</given-names>
   </author>
   <author>
      <surname>Example2</surname>
      <given-names>Example2</given-names>
   </author>
   <author>
      <surname>Example3</surname>
      <given-names>Example3</given-names>
   </author>
</fo:block>
<fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <author>
      <surname>Example4</surname>
      <given-names>Example4</given-names>
   </author>
   <author>
      <surname>Example5</surname>
      <given-names>Example15</given-names>
   </author>
</fo:block>
1 голос
/ 10 ноября 2019

Я думаю, если у вас есть доступ к XSLT 2 или 3, вы можете использовать

  <xsl:template match="contrib-group">
      <xsl:for-each-group select="contrib[@contrib-type = 'author']" group-starting-with="*[@pdf_break = 'true']">
          <fo:block>
              <xsl:apply-templates select="current-group()"/>
          </fo:block>
      </xsl:for-each-group>
  </xsl:template>

https://xsltfiddle.liberty -development.net / 3NSSEv4 / 1 - минимальный образец,конечно, вам нужно добавить шаблоны для оставшегося XML-ввода в преобразование XSL-FO.

...