Сопоставьте все узлы, которые содержат дочерний узел с определенным содержимым - PullRequest
1 голос
/ 09 марта 2012

Предположим, у меня есть этот документ XML, где ... просто представляет другие узлы:

<AA>
    <BB>
        <CC>True</CC>
        ...
    </BB>

    <BB>
        <CC>True</CC>
        ...
    </BB>

    <BB>
        <CC>False</CC>
        ...
    </BB>

    <BB>
        <CC>True</CC>
        ...
    </BB>


    <BB>
        <CC>False</CC>
        ...
    </BB>
</AA>

Я пытаюсь создать несколько шаблонов, например:

<xsl:template match="/">

<DD>
    <xsl:apply-templates select="/AA/YYY" />
</DD>

<EE>
    <xsl:apply-templates select="/AA/XXX" />
</EE>

</xsl:template>

<xsl:template match="YYY">
 <!-- do stuff -->
</xsl:template>

<xsl:template match="XXX">
   <!-- do stuff -->
</xsl:template>

Чтобы получить вывод, похожий на этот:

<AA>
    <DD>
        <BB>
            <CC>True</CC>
        </BB>
        <BB>
            <CC>True</CC>
            ...
        </BB>

        <BB>
            <CC>True</CC>
            ...
        </BB>
    </DD>

    <EE>
        <BB>
            <CC>False</CC>
            ...
        </BB>

        <BB>
            <CC>False</CC>
            ...
        </BB>
    </EE>
</AA>

Я просто пытаюсь найти xpath для размещения в атрибутах соответствия, где я в настоящее время размещаю XXX и YYY.Кто-нибудь получил ответ?

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

1 Ответ

1 голос
/ 09 марта 2012

Если вы используете преобразование идентичности, вам не нужны никакие дополнительные шаблоны, если вы не собираетесь ничего менять в элементах <BB>.

Ввод XML

<AA>
  <BB>
    <CC>True</CC>
    ...
  </BB>

  <BB>
    <CC>True</CC>
    ...
  </BB>

  <BB>
    <CC>False</CC>
    ...
  </BB>

  <BB>
    <CC>True</CC>
    ...
  </BB>


  <BB>
    <CC>False</CC>
    ...
  </BB>
</AA>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="/AA">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <DD>
        <xsl:apply-templates select="BB[CC='True']"/>
      </DD>
      <EE>
        <xsl:apply-templates select="BB[CC='False']"/>
      </EE>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Вывод XML

<AA>
  <DD>
    <BB>
      <CC>True</CC>
      ...
    </BB>
    <BB>
      <CC>True</CC>
      ...
    </BB>
    <BB>
      <CC>True</CC>
      ...
    </BB>
  </DD>
  <EE>
    <BB>
      <CC>False</CC>
      ...
    </BB>
    <BB>
      <CC>False</CC>
      ...
    </BB>
  </EE>
</AA>

Если вам нужно изменить <BB>добавьте дополнительные шаблоны для переопределения преобразования идентификаторов.

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