Шаблон идентичности и приоритет создания дублирующих узлов в XSL - PullRequest
1 голос
/ 18 октября 2019

Итак, у меня есть следующий XML-ввод:

<parent>
  <para> text 1 <NodeTypeA id="1">element1</NodeTypeA> text2 <Xref ref="1"/> text3</para>
  <para>text 4</para>
  <para><NodeTypeA id="2">elt2</NodeTypeA></para>
  <para>text5 <Xref red="2"/>text6 <Xref ref="3"/>text7</para>
</parent>

Я пытаюсь извлечь узел Xref и разделить узлы para на две части, и благодаря этот ответ , этотработает. Однако в моем коде XSL мне нужно иметь шаблон идентификации и некоторый приоритет в моих шаблонах.

Вот мой полный код:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:template match="@*|node()" priority="0">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="para[Xref]" priority="1">
        <xsl:apply-templates select="node()[1]"/>
    </xsl:template>

    <xsl:template match="para/node()[not(self::Xref)]" priority="1">
        <xsl:param name="group" select="."/>
        <xsl:apply-templates select="following-sibling::node()[1]">
            <xsl:with-param name="group" select="$group | ."/>
        </xsl:apply-templates>
    </xsl:template>

    <xsl:template match="para/node()[not(self::Xref) and not(following-sibling::Xref)][last()]" priority="1">
        <xsl:param name="group" select="."/>
        <para>
            <xsl:copy-of select="$group | ."/>
        </para>
    </xsl:template>

    <xsl:template match="para/Xref" priority="1">
        <xsl:param name="group"/>
        <xsl:if test="$group">
            <para>
                <xsl:copy-of select="$group"/>
            </para>
        </xsl:if>
        <xsl:copy-of select="."/>
        <xsl:apply-templates select="following-sibling::node()[1]"/>
    </xsl:template>

</xsl:stylesheet>

Проблема заключается в том, что узлы para, которыеНЕ содержат узел Xref, дублируются в моем выводе, в то время как те, которые содержат узел Xref, преобразуются просто отличноВот вывод XML, который я получаю:

<?xml version="1.0"?>
<parent>
    <para> text 1 <NodeTypeA id="1">element1</NodeTypeA> text2 </para>
    <Xref ref="1" />
    <para> text3</para>
    <para><para>text 4</para></para>
    <para><para><NodeTypeA id="2">elt2</NodeTypeA></para></para>
    <para>text5 </para>
    <Xref red="2" />
    <para>text6 </para>
    <Xref ref="3" />
    <para>text7</para>
</parent>

Почему добавление шаблона идентификации и некоторого приоритета нарушает это и как я могу это исправить?

PS: я использую XSLT 1

1 Ответ

0 голосов
/ 20 октября 2019

Если я правильно понял проблему - описание довольно запутанное,

Вот одно из решений :

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

 <xsl:key name="kPrecedingXref" match="node()[not(self::Xref)]" 
                                use="generate-id(following-sibling::Xref[1])"/>

  <xsl:template match="node()|@*" name="identity">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="para[Xref]">
    <xsl:apply-templates select="Xref"/>
    <para>
      <xsl:apply-templates 
                    select="node()[not(self::Xref) and not(following-sibling::Xref)]"/>
    </para>
  </xsl:template>

  <xsl:template match="para/Xref">
    <para>
      <xsl:apply-templates select="key('kPrecedingXref', generate-id())"/>
    </para>
    <xsl:call-template name="identity"/>
  </xsl:template>
</xsl:stylesheet>

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

<parent>
  <para> text 1 <NodeTypeA id="1">element1</NodeTypeA> text2 <Xref ref="1"/> text3</para>
  <para>text 4</para>
  <para><NodeTypeA id="2">elt2</NodeTypeA></para>
  <para>text5 <Xref red="2"/>text6 <Xref ref="3"/>text7</para>
</parent>

Требуется правильный результат:

<parent>
   <para> text 1 <NodeTypeA id="1">element1</NodeTypeA> text2 </para>
   <Xref ref="1"/>
   <para> text3</para>
   <para>text 4</para>
   <para>
      <NodeTypeA id="2">elt2</NodeTypeA>
   </para>
   <para>text5 </para>
   <Xref red="2"/>
   <para>text6 </para>
   <Xref ref="3"/>
   <para>text7</para>
</parent>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...