Как проверить, не существует ли дочерний узел? - PullRequest
0 голосов
/ 07 сентября 2018

Мне нужно создать xslt, чтобы иметь кроссовер для 2 разных xsd-файлов, чтобы одна версия могла совпадать с другой. У меня есть элемент с детьми, где некоторые дети являются необязательными. В этом случае. Тест 3 не является обязательным.

<Test1>
    <TestA>data</TestA>
    <TestB>data</TestB>
    <TestC>data</TestC>
</Test1>
<Test2>
    <TestA>data</TestA>
    <TestC>data</TestC>
</Test2>

Теперь я хочу посмотреть, существует ли Testb, и если нет, я должен добавить его в нужном месте (между Testa и Testc). Обратите внимание, что Test1 уже является потомком какого-либо другого элемента, и я «связываю» каждый элемент с xsl: for-each.

Есть ли способ сделать это? Спасибо!

1 Ответ

0 голосов
/ 07 сентября 2018

Чтобы проверить, существует ли элемент, вы можете использовать xsl:if или xsl:when с соответствующими test="element_name".

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

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

  <xsl:template match="*[matches(name(),'[a-z]+\d+','i')]">
    <xsl:copy>
      <xsl:variable name="curr" select="."/>
      <xsl:for-each select="('A','B','C')">
        <xsl:variable name="childName" select="concat('Test',.)"/>
        <xsl:variable name="elem" select="$curr/*[name() = $childName]"/>
        <xsl:element name="{$childName}">
          <xsl:choose>
            <xsl:when test="$elem">
              <xsl:value-of select="$elem"/>
            </xsl:when>
            <xsl:otherwise>
              <xsl:text>Surrogate value for </xsl:text>
              <xsl:value-of select="$childName"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:element>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

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

Основная часть представляет собой шаблон, соответствующий элементу, имя которого состоит из букв (по крайней мере, одной) и затем цифр (снова, по крайней мере, одной).

Затем для хранения * 1012 необходима переменная curr* текущий элемент , потому что цикл for-each меняет его, но нам все еще нужна ссылка на текущий элемент external .

For-each цикл организует обработку любого дочернего элемента Test ... элемент, имя которого заканчивается на A, B или C.

Если требуемый дочерний элемент существует, его значение печатается, в противном случае сценарий печатает соответствующийсуррогатное значение.

Возможно, вам нужна не последняя версия, но, по крайней мере, у вас есть отправная точка для создания окончательной версии.

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