XSLT: исправлено для вывода текста из всех областей - PullRequest
0 голосов
/ 27 июня 2018

У меня есть этот образец XML-документа

<root>
    <type1></type1>
    <type2>
        <text>
            This is a test
        </text>
    </type2>
    <type3>
        <child>3</child>
    </type3>
    <type4></type4>
    <type5></type5>
    <type6></type6>
    <type7>
        <text>
            This is a test
        </text>
        <child>7</child>
    </type7>
</root>

И я хотел бы, чтобы окончательный вывод содержал только данные типа 3 и типа 7

<root>
    <type3>
        <child>3</child>
    </type3>
    <type7>
        <text>
            This is a test
        </text>
        <child>7</child>
    </type7>
</root>

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

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*" />  
<xsl:template match="root | type3 | type7 | *[ancestor::type3] | *[ancestor::type7] | comment() | processing-instruction() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template> 

</xsl:stylesheet>

Но это производит вывод

<root>
   This is a test
   <type3>
       <child>3</child>
   </type3>
   <type7>
        <text> This is a test </text>
        <child>7</child>
   </type7>
</root>

Как мне не дать XML сохранить текст в областях, которые я не хочу хранить, например, в узле типа 2? Я знаю, что эта проблема связана со стандартными встроенными шаблонами, но я не уверен, как обойти это.

1 Ответ

0 голосов
/ 27 июня 2018

Решение было дано в Это сообщение StackOverflow

Решение

<xsl:template match="root | node()[ancestor-or-self::type3] | node()[ancestor-or-self::type7] | comment() | processing-instruction() | @*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template> 

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