Удаление тегов из XML с помощью XSLT - PullRequest
0 голосов
/ 08 июля 2020

У меня есть один XML, где я хочу удалить некоторые теги, и мне нужно сохранить элементы внутри него. Ниже приведен образец. образец XML:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <body>
         <vStatusResponse>
            <Access>Y</Access>
         </vStatusResponse>
      </body>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <body>
         <vRulesResponse>
            <Access>Y</Access>
         </vRulesResponse>
      </body>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <body>
         <vAppAccessResponse>
            <Access>Y</Access>
         </vAppAccessResponse>
      </body>
   </services>
</aggRes>

Требуемый вывод:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <Access>Y</Access>
   </services>
</aggRes>

Я пробовал использовать этот код XSLT: Код XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*" />
         <xsl:apply-templates />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="body">
      <xsl:copy-of select="node()" />
   </xsl:template>
   <xsl:template match="vStatusResponse">
      <xsl:copy-of select="node()" />
   </xsl:template>
</xsl:stylesheet>

Он не работает должным образом . может кто поможет получить требуемый XML.

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Вы хотите <xsl:apply-templates>, а не <xsl:copy-of>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <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="body|vStatusResponse|vRulesResponse|vAppAccessResponse">
        <xsl:apply-templates select="node()" />
    </xsl:template>
</xsl:stylesheet>

Менее явной (и, следовательно, потенциально более гибкой) альтернативой будет

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

Вывод в любом случае:

<aggRes>
   <services>
      <serviceIdentifier>vStatus</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vRules</serviceIdentifier>
      <Access>Y</Access>
   </services>
   <services>
      <serviceIdentifier>vAppAccess</serviceIdentifier>
      <Access>Y</Access>
   </services>
</aggRes>
0 голосов
/ 08 июля 2020

У вас больше исключений из правила, чем узлов, которые должны ему соответствовать. Почему бы вам не подойти к этому с противоположной стороны? Тогда все , которые вам нужно сделать, это:

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="*"/>

<xsl:template match="aggRes | services | serviceIdentifier | Access">
    <xsl:copy>
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>

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