XSLT для копирования только определенных узлов - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть ввод XML, который выглядит следующим образом:

 <root>
      <NFe>
        <infNFe>
          <wanted_node_1>
            <stuff>1111111</stuff>
          </wanted_node_1>

          <wanted_node_2>
            <stuff>2222222</stuff>
          </wanted_node_2>

          <unwanted_node_1>
            <stuff>aa</stuff>
          </unwanted_node_1>

         ...

          <unwanted_node_25>
            <stuff>zz</stuff>
          </unwanted_node_25>

        </infNFe>
      </NFe>

    </root>

Я хочу, чтобы вывод был файлом XML с двумя братьями и сестрами " требуемые узлы " как таковые

<root>
  <NFe>
    <infNFe>

      <wanted_node_1>
        <stuff>1111111</stuff>
      </wanted_node_1>

      <wanted_node_2>
        <stuff>2222222</stuff>
      </wanted_node_2>

    </infNFe>
  </NFe>
</root>

Я НЕ хочу копировать 25 других братьев и сестер " unwanted_nodes ".Я новичок в XSL, и код, который я написал, решает эту проблему, создав список исключений длиной 25 элементов, содержащий все нежелательные элементы:

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

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

  <xsl:template match="wanted_node_1 | wanted_node_2 ">
    <xsl:element name="{name()}">
      <xsl:apply-templates />
    </xsl:element>
  </xsl:template>

  <!--exceptions list-->
  <xsl:template match="unwanted_node_1 | unwanted_node_2 | unwanted_node_3 | ... | unwanted_node25 "/>

</xsl:stylesheet>

Моя проблема заключается в том, что в настоящее время список из 25 нежелательных длинныхчисло братьев и сестер может увеличиться, что заставит меня постоянно обновлять «список исключений», что является очевидным плохим подходом.Поскольку мои два " требуемые узлы " всегда будут одинаковыми, я бы хотел, чтобы мой XSLT копировал ТОЛЬКО 2 требуемых узла, пропуская все остальные элементы, используя такую ​​логику:

если match = wanted_node_1 или match = wanted_node_2 , тогда делать вещи else skipp нежелательный узел end if

Я пытался работать со списком исключений, используя такие вещи, как

  <xsl:template match="not(self::wanted_node_1) and not(self::wanted_node_2)>

со многими перестановками позиций скобок, фигурных скобок и т. д., но всегда получал сообщение об ошибке.Как тогда ограничить вывод XML только двумя требуемыми узлами без создания 25 длинных списков нежелательных братьев и сестер?

Любая помощь будет принята с благодарностью.Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Вы можете сделать просто:

XSLT 1.0

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

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

<xsl:template match="infNFe">
    <xsl:copy>
        <xsl:apply-templates select="wanted_node_1 | wanted_node_2"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 20 сентября 2019

Использование <xsl:template match="infNFe/*[not(self::wanted_node_1 | self::wanted_node_2)]"/>.

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