Скопируйте одно значение в XML в два разных места в другом XML - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть XML-файл с такой структурой:

<DetailTxt>
    <Text>
        <span>Some Text</span>
    </Text>
    <TextComplement Kind="Owner" MarkLbl="1">
        <ComplCaption>
            Caption 1
        </ComplCaption>
        <ComplBody>
            Body 1
        </ComplBody>
    </TextComplement>
    <Text>
        <span>More Text</span>
    </Text>
</DetailTxt>

Вот часть XSLT, которая имеет отношение здесь:

<xsl:template match="*[local-name() = 'DetailTxt']">
    <xsl:apply-templates select="*[local-name() = 'Text']"/>
</xsl:template>

<xsl:template match="*[local-name() = 'Text']">
    <item name="{local-name()}">
        <richtext>
            <par>
                <run>
                    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                    <xsl:apply-templates/>
                    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
                </run>
            </par>
        </richtext>
    </item> 
    <item name="{local-name()}">
       <richtext>
            <par>
                <run>
                    <xsl:text disable-output-escaping="yes">&lt;![CDATA[</xsl:text>
                    <xsl:value-of select="concat('[', ../TextComplement/@Kind, ../TextComplement/@MarkLbl,']')" />
                    <xsl:text disable-output-escaping="yes">]]&gt;</xsl:text>
                </run>
            </par>
        </richtext>
    </item>
</xsl:template>

Я ожидаю, что вывод будет выглядеть следующим образом:

<item name="Text">
    <richtext>
        <par>
            <run><![CDATA[
                <span>Some Text</span>
            </p>]]></run>
        </par>
    </richtext>
</item>
<item name="Text">
    <richtext>
        <par>
            <run><![CDATA[[Owner1]]]></run>
        </par>
    </richtext>
</item>

Но строка, использующая XPath TextComplement, выглядит следующим образом:

            <run><![CDATA[[]]]></run>

Все значения из TextComplement отсутствуют.Что не так с XPath здесь?

РЕДАКТИРОВАТЬ: Я полностью переработал свой вопрос и вставил конкретный вопрос, полученный в результате первого ответа.Такого рода аннулирует первый ответ, но ИМХО улучшает вопрос.

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Не уверен, как выглядит XSLT, но вы можете попробовать добавить следующий шаблон с функцией concat() для получения выходных данных.

<xsl:template match="Text">
    <document version="9.0" form="Form1">
        <item name="{local-name()}">
            <xsl:copy-of select="span" />
        </item>
        <item name="{local-name()}">
            <span>
                <xsl:value-of select="concat('[', ../TextComplement/@Kind, ../TextComplement/@MarkLbl, ']')" />
            </span>
        </item>
    </document>
</xsl:template>

Этот шаблон применяется к узлу <Text> и../ используется для перехода на один уровень вверх и доступа к атрибутам <TextComplement> с помощью XPath.

Вывод шаблона при применении к вашему XML будет выглядеть следующим образом.

<document form="Form1" version="9.0">
    <item name="Text">
        <span>Some Text</span>
    </item>
    <item name="Text">
        <span>[Owner1]</span>
    </item>
</document>

Тот же шаблон также будет применен к узлу <Text>, имеющему содержимое More Text, и произведет аналогичный вывод.

0 голосов
/ 03 мая 2019

Я сам нашел решение для конкретного вопроса. Я уверен, что это проблема IBM Notes / LotusScript.

При использовании селектора

../TextComplement/@Kind

парсер вернул пустую строку. Я изменил на

../*[local-name() = 'TextComplement']/@Kind

и более поздние (более конкретные):

./following-sibling::*[local-name() = 'TextComplement']/@Kind

И это сработало. Я лично не вижу разницы в этих обозначениях, но кажется, что внутренне они обрабатываются по-разному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...