поиск особенного узла в условии if XSLT - PullRequest
0 голосов
/ 29 июня 2018

Привет, у меня проблемы с условием if в моем коде. Ну, если быть точным, вот XML-файл:

<root name="fristLevel">
    <test name="secondaryLevel_1">
        <medium>
            <scribe>
                <cloude>
                    something is here
                </cloude>
            </scribe>
            <demo>
                something is here
            </demo>
        </medium>
    </test>
    <test name="secondaryLevel_2">
        <medium>
            <demo>
                something is here
            </demo>
        </medium>
    </test>
</root>

Я ищу условие IF, которое что-то делает, если medium имеет дочерний узел следующим образом:

<xsl:for-each select="root/test">
    <xsl:if test="medium/scribe/node()">
        <!-- something here  -->
    </xsl:if>
</xsl:for-each>

Но это не работает для меня. У кого-нибудь есть идея получше?

1 Ответ

0 голосов
/ 01 июля 2018

Ваша идея выглядит хорошо, но, возможно, вам не удалось разместить этот код в нужном месте.

Даже если ваш код был помещен в шаблон, соответствующий целому документ /, вывод не будет правильно сформированным XML, потому что XML-документ должен содержать один узел на основном (корневом) уровне.

Так, вероятно:

  • Скрипт должен содержать соответствующий шаблон root (ваш главный узел).
  • Теги для основного узла должны быть скопированы (<xsl:copy>), в противном случае на выходе не было бы одного основного узла.
  • И, наконец, в пределах этого (между <xsl:copy> и </xsl:copy> метки) там должны быть размещены ваши <xsl:for-each цикл.
  • Скрипт должен также включать шаблон идентификации .

Примерно так:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <xsl:for-each select="test">
        <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <xsl:if test="medium/scribe/node()">
            <HasScribe><xsl:value-of select="medium/scribe"/></HasScribe>
          </xsl:if>
        </xsl:copy>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

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

Как видите, я также добавил xsl:apply-templates для атрибутов, так что в выводе видно, из какого исходного элемента был сгенерирован конкретный выходной элемент.

Рабочий пример с незначительным изменением вашего XML см. http://xsltransform.net/ei5Pwjn

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