Удалите все узлы из XML, кроме определенных узлов, используя XSLT - PullRequest
2 голосов
/ 26 мая 2010

У меня есть куча XML-файлов с различным количеством узлов данных, и я хочу изменить файлы, используя XSLT, чтобы включить только определенные узлы. Пример:

<?xml version="1.0" encoding="UTF-8"?> 
 <SomeName> 
 <identifier> 
    <UID> 1234 </UID> 
 </identifier> 
 <MainNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a0</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a1</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a2</Subnode1a> 
     </SubNode1> 
  </MainNode1> 

  <MainNode2> 
     <SubNode2> 
        <Subnode2a>DATA2a0</Subnode2a> 
     </SubNode2> 
  </MainNode2> 

  <MainNodeIDONTCARE> 
       <SubnodeWhatever> 
       </SubnodeWhatever> 
  </MainNodeIDONTCARE> 

  <MainNodeuseless> 
       <SubnodeWhatever> 
       </SubnodeWhatever> 
  </MainNodeuseless>

  <MainNodewhatever> 
       <SubnodeWhatever> 
       </SubnodeWhatever> 
  </MainNodewhatever>
</SomeName> 

Теперь мой окончательный XML-файл должен выглядеть так:

<?xml version="1.0" encoding="UTF-8"?> 
 <SomeName> 
 <identifier> 
    <UID> 1234 </UID> 
 </identifier> 
 <MainNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a0</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a1</Subnode1a> 
     </SubNode1> 
     <SubNode1> 
        <Subnode1a>DATA1a2</Subnode1a> 
     </SubNode1> 
  </MainNode1> 

  <MainNode2> 
     <SubNode2> 
        <Subnode2a>DATA2a0</Subnode2a> 
     </SubNode2> 
  </MainNode2>
</SomeName> 

Я пытался сделать это с помощью XSLT, но я не могу этого сделать.

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 26 мая 2010

Вероятно, самое короткое решение - это следующее :

<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="MainNodeIDONTCARE | MainNodeuseless | MainNodewhatever"/>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу, получается требуемый вывод :

<SomeName>
    <identifier>
        <UID> 1234 </UID>
    </identifier>
    <MainNode1>
        <SubNode1>
            <Subnode1a>DATA1a0</Subnode1a>
        </SubNode1>
        <SubNode1>
            <Subnode1a>DATA1a1</Subnode1a>
        </SubNode1>
        <SubNode1>
            <Subnode1a>DATA1a2</Subnode1a>
        </SubNode1>
    </MainNode1>
    <MainNode2>
        <SubNode2>
            <Subnode2a>DATA2a0</Subnode2a>
        </SubNode2>
    </MainNode2>
</SomeName>

Обратите внимание на использование самого фундаментального шаблона проектирования XSLT: использование и переопределение правила идентификации .

1 голос
/ 26 мая 2010

Это должно работать:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="SomeName">
    <xsl:copy>
      <xsl:for-each select="identifier|MainNode1|MainNode2">
        <xsl:copy>
          <xsl:apply-templates />
        </xsl:copy>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

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

</xsl:stylesheet>
0 голосов
/ 26 мая 2010

Вот оно

<?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="SomeName">
    <xsl:copy>
      <xsl:for-each select="identifier|MainNode1|MainNode2">
        <xsl:apply-templates select="." />
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>

    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...