Белый список элементов XSLT - PullRequest
0 голосов
/ 22 февраля 2020

Я начал использовать XSLT (6 месяцев, новичок ie) и пытаюсь понять, как использовать белый список элементов в большом файле XML, чтобы сохранить только элементы в белом списке.

ирония в том, что я запускал предыдущий XSLT, который представляет собой просто большой список того, что не включать.
Из постов здесь я вижу, что если бы я только смотрел, какие элементы тоже хранятся, список будет гораздо легче поддерживать .

сохранить только элементы и / или атрибуты, занесенные в белый список

XSLT - Как сохранить только нужные элементы из XML

Я использую Saxon-HE 9.9.1.1N.

Вот уменьшенная версия моего XML, где я не хочу сохранять тип & brand elements.

<?xml version="1.0" encoding="UTF-8"?>
<FlatTable>
   <Table>
      <type>1</type>
      <ID>0001</ID>
      <Brand>0</Brand>
      <Name>Test 1</Name>
      <code>X7F7</code>
   </Table>
   <Table>
      <type>1</type>
      <ID>0002</ID>
      <Brand>0</Brand>
      <Name>Test 2</Name>
      <code>X7F5</code>
   </Table>
</FlatTable>

Ожидаемый результат будет:

<?xml version="1.0" encoding="UTF-8"?>
<FlatTable>
   <Table>
      <ID>0001</ID>
      <Name>Test 1</Name>
      <code>X7F7</code>
   </Table>
   <Table>
      <ID>0002</ID>
      <Name>Test 2</Name>
      <code>X7F5</code>
   </Table>
</FlatTable>

Я пытаюсь использовать решение, поставленное здесь Dimitre Novatchev но не могу за всю жизнь увидеть, куда я это напортачу: XSLT - Как сохранить только разыскиваемое элементы от XML

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

 <ns:WhiteList>
  <name>ID</name>
  <name>Name</name>
  <name>code</name>
 </ns:WhiteList>

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

 <xsl:template match=
  "*[not(descendant-or-self::*[name()=document('')/*/ns:WhiteList/*])]"/>
</xsl:stylesheet>

1 Ответ

1 голос
/ 22 февраля 2020

Я думаю, что белый список в XSLT 2 или 3 можно просто сохранить в параметре или переменной:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:param name="white-list"
    as="xs:string*" select="'ID', 'Name', 'code'"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="*[not(descendant-or-self::*[name()=$white-list])]"/>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bFWRApn

...