дерево узлов полосы xslt на основе атрибута - PullRequest
1 голос
/ 29 августа 2011

Я хотел бы использовать xslt для преобразования XML-файла в почти идентичный XML-файл, но вырезать узлы на основе атрибута. Если у узла есть атрибут, его дочерние элементы не копируются в выходной файл. Например, я хочу удалить узлы из следующего XML-файла, которые имеют атрибут «исправно» «not_really»

это xml для преобразования

<diet>

  <breakfast healthy="very">
    <item name="toast" />
    <item name="juice" />
  </breakfast>

  <lunch healthy="ofcourse">
    <item name="sandwich" />
    <item name="apple" />
    <item name="chocolate_bar" healthy="not_really" />
    <other_info>lunch is great</other_info>
  </lunch>

  <afternoon_snack healthy="not_really" >
    <item name="crisps"/>
  </afternoon_snack>

  <some_other_info>
    <otherInfo>important info</otherInfo>
  </some_other_info>
</diet>

это желаемый вывод

<?xml version="1.0" encoding="utf-8" ?>

<diet>

  <breakfast healthy="very">
    <item name="toast" />
    <item name="juice" />
  </breakfast>

  <lunch healthy="ofcourse">
    <item name="sandwich" />
    <item name="apple" />
    <other_info>lunch is great</other_info>
  </lunch>

  <some_other_info>
    <otherInfo>important info</otherInfo>
  </some_other_info>
</diet>

это то, что я пытался (без успеха:)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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

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

1 Ответ

0 голосов
/ 29 августа 2011

Две небольшие проблемы:

  1. Значение not_really должно быть в кавычках, чтобы обозначить, что это текстовое значение.В противном случае он будет оценивать его как поиск элемента с именем «not_really».
  2. Ваш шаблон apply выбирает узлы, значение которых @healthy равно «not_really», вам нужно обратное.*

    Применены исправления к вашей таблице стилей:

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()[not(@healthy='not_really')]"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    Кроме того, вы можете просто создать пустой шаблон для элементов, которые имеют @healthy='not_really':

    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="*[@healthy='not_really']"/>
    
    </xsl:stylesheet>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...