извлечь узел элемента через XPath? - PullRequest
0 голосов
/ 03 апреля 2019

Часть ввода xml ist

<root>
    <page>1</page>
    <embedded>
        <items>
            <_links>
                    <href>abc</href>
            </_links>
            <parent>null</parent>
            <enabled>true</enabled>
            <values>
            <data1>
                <locale>DE</locale>
                <scope>null</scope>
                <data>abc</data>
            </data1>
                <data3>
                    <locale>null</locale>
                    <scope>null</scope>
                    <data>producta</data>
                    <links>
                        <download>
                        </download>
                    </links>
                </data3>
                <data4>
                    <locale>null</locale>
                    <scope>null</scope>
                    <data>productc</data>
                </data4>
            </values>
        </items>
    </embedded>
</root>

Сначала я сохранил содержимое элемента данных в переменной (это важно для других шагов в моем коде XSLT.)

 <xsl:variable name="content" select="root/embedded/items[position()=$+1]/values/*/data"/>

Я хочу проверить все данные. Я ищу способ, как я могу написать условие, в котором у меня есть просто содержимое элемента данных (например, «producta»), сохраненного в переменной. Условие должно проверять, имеет ли элемент locale (previous-sibling) содержимое null, и когда это условие истинно, скопируйте родительский элемент и элемент данных.

  1. переменное содержимое = producta
  2. предыдущий брат producta - locale = null
  3. если условие истинно, скопируйте элемент данных и родительский элемент

Вывод должен выглядеть как

                    <data3>
                        <data>producta</data>
                    </data3>
                    <data4>  
                        <data>productc</data>
                    </data4>

Заранее спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Если items[position()=$+1] - опечатка, я предположил (временно), что items[position()=1]

Тогда ожидаемый результат может быть достигнут в XSLT 1.0 следующим образом:

<xsl:stylesheet xmlns:xalan="http://xml.apache.org/xalan"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output method="xml" version="1.0" indent="yes" />

<xsl:variable name="content" 
  select="/root/embedded/items[position()=1]/values/*/data" />

<xsl:template match="/">
    <xsl:for-each select="$content[preceding-sibling::locale[.= 'null']]">
        <xsl:element name="{name(..)}">
            <xsl:copy-of select="." />
        </xsl:element>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

http://xsltfiddle.liberty -development.net / bFN1y9k

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