XSLT: использование if for for-each с исключениями - PullRequest
0 голосов
/ 09 января 2020

Привет, я только начал работать с XSLT 3 дня go, и я застрял в проблеме, на которую не могу найти ответ. my xml выглядит примерно так:

<process>
    <documents>
        <document>
            <titel>Doc1</titel>
        </document>
        <document>
            <titel>Doc2</titel>
        </document>
    </documents>
</process>

Я пытаюсь создать xml со списком всех документов, кроме документа с заголовком "Doc1". Я не знаю, сколько документов будет в этом файле.

Так что я подумал, начиная с for-each l oop:

<documente>
    <xsl:for-each select="/process/documents[1]/document[1]/">
        <document filename="{titel}"/>
    </xsl:for-each>
</documente>

, который дает мне титр каждого документа, независимо от того, сколько их (как атрибут элемента "документ"). И теперь я застрял. Я попытался выполнить if for for-each безуспешно, как это:

<documents>
    <xsl:for-each select="/process/documents[1]/document[1]/">
        <xsl:if test="/process/documents[1]/document[1]/element[@name='titel']/value[1]!='Doc1'">
            <document>
                <xsl:attribute name="filename">
                    <xsl:value-of select="/process/documents[1]/document[1]/element[@name='titel']/value[1]"/>
                </xsl:attribute>
        </xsl:if>
    </xsl:for-each>
</documents>

А теперь я благодарен за каждый ваш совет.

Ответы [ 2 ]

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

Ваше выражение XPath

/process/documents[1]/document[1]/

неверно из-за последнего символа "/": оно должно дать вам синтаксическую ошибку.

Если вы измените его на

/process/documents[1]/document[1]

затем вы выбираете первого document дочернего элемента первого documents дочернего элемента process. Вы не выбираете «каждый документ, независимо от того, сколько их», как вы предлагаете в своем вопросе.

Если вы измените его на

/process/documents[1]/document

, то теперь выбираются все document элементов.

Если вы хотите поместить xsl: если внутри xsl: for-each, то вы можете. Но помните, что элемент контекста внутри xsl: for-each является узлом, выбранным xsl: for-each. Поэтому написание

<xsl:for-each select="/process/documents[1]/document">
    <xsl:if test="/process/documents[1]/document/titel = 'xyz'">

не будет полезным, поскольку xsl:if начинается с root документа XML, а не с выбранного в данный момент элемента document. Вместо этого вам нужен относительный путь:

<xsl:for-each select="/process/documents[1]/document">
    <xsl:if test="titel = 'xyz'">

Но если все тело xsl:for-each является инструкцией xsl:if, то лучше добавить предикат в xsl:for-each/@select, например, так: :

<xsl:for-each select="/process/documents[1]/document[titel = 'xyz']">
0 голосов
/ 09 января 2020

Это простой предикат XPath, который вам нужен на document, например, document[titel != 'Doc1']. Нет необходимости в каких-либо инструкциях XSLT.

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