XSLT объединяет "params" с "match =" @ * | node () " - PullRequest
0 голосов
/ 21 октября 2019

ЦЕЛЬ

Вывод XML с точными именами ввода и переменными в виде XML, который мой XSLT получает + 2 параметра из внешних источников

PSEUDOCODE - XSLT (1.0) Я использую переменные вместо параметров, чтобы было проще тестировать

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

    <xsl:variable name="StatusCode" select="'11111111111'">
    </xsl:variable>

    <xsl:variable name="StatusMessage" select="'########'">
    </xsl:variable>

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

<!-- BLOCK 2 -->
    <xsl:template match="/">
        <StatusCode>
            <xsl:value-of select="$StatusCode"/>
        </StatusCode>
        <StatusMessage>
            <xsl:value-of select="$StatusMessage"/>
        </StatusMessage>
    </xsl:template> 
<!-- ------- -->

</xsl:stylesheet>

ПРОБЛЕМА

Если я попробую «БЛОК 1» или «БЛОК 2 "независимо, они работают, но я не мог при желании объединить их обоих

1 Ответ

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

Ваш шаблон BLOCK 2 применяется первым, потому что он соответствует корневому узлу. Этот шаблон не содержит xsl:apply-templates инструкций - поэтому другой шаблон никогда не выполняется.

Вопрос в том, ГДЕ вы хотите, чтобы добавленные узлы появлялись. Вы можете сделать:

<!-- BLOCK 2 -->
    <xsl:template match="/">
        <xsl:apply-templates/>
        <StatusCode>
            <xsl:value-of select="$StatusCode"/>
        </StatusCode>
        <StatusMessage>
            <xsl:value-of select="$StatusMessage"/>
        </StatusMessage>
    </xsl:template> 
<!-- ------- -->

, но это поместит добавленные узлы за пределы корневого элемента, сделав результат XML-фрагментом вместо правильно сформированного XML-документа.

...