Добавить узел внутри дерева узлов - XSL - PullRequest
0 голосов
/ 09 января 2020

Я на самом деле выполняю преобразование с помощью XSL, и мне нужно создать шаблон, который сможет добавить узел в дерево узлов и вернуть все это дерево узлов с новым узлом.

В моем примере , Я хотел бы добавить узел <node3>HIJ</node3> после </node2>, он работает в какой-то момент, но я теряю верхний узел.

Дерево узлов:

<xsl:variable name="A">
  <node>
    <node1>ABC</node1>
    <node2>DEF</node2>
    <node4>KLM</node4>
  </node>
</xsl:variable>

вызов шаблона

<xsl:apply-templates select="$A" mode="copy">
  <xsl:with-param name="ValueOfTheNode" select="'HIJ"/>
</xsl:apply-templates>

Мой шаблон, который фактически не работает

<xsl:template match="node()/*" mode="copy">
    <xsl:param name="ValueOfTheNode"/>
    <xsl:copy-of select="."/>
    <xsl:if test="./name() = 'node2'">
        <node3>
            <xsl:value-of select="$ValueOfTheNode"/>
        </node3>
    </xsl:if>
</xsl:template>

Текущий результат:

<node1>ABC</node1>
<node2>DEF</node2>
<node3>HIJ</node3>
<node4>KLM</node4>

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

<node>
    <node1>ABC</node1>
    <node2>DEF</node2>
    <node3>HIJ</node3>
    <node4>KLM</node4>
</node>

Я не знаю, как сказать коду сохранить верхний узел, или, может быть, я с самого начала ошибаюсь в том, как его лечить. Я использую xsl 2.0.

Спасибо

1 Ответ

0 голосов
/ 09 января 2020

Я бы просто написал шаблон, соответствующий node2:

<xsl:template match="node2" mode="copy">
    <xsl:param name="value" tunnel="yes"/>
    <xsl:next-match/>
    <node3>
        <xsl:value-of select="$value"/>
    </node3>
</xsl:template>

, затем использовал бы

    <xsl:apply-templates select="$A" mode="copy">
      <xsl:with-param name="value" select="'HIJ'" tunnel="yes"/>
    </xsl:apply-templates>

и имел бы шаблон по умолчанию для режима, устанавливающего преобразование идентичности, например <xsl:mode name="copy" on-no-match="shallow-copy"/> в XSLT 3 или прописано в XSLT 2 как

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

https://xsltfiddle.liberty-development.net/gWEaSuS

...