Как удалить теги xml только с помощью xslt

<document>
    <body>
        <p>
            <pPr>
                <autoSpaceDE/>
                <autoSpaceDN/>
                <adjustRightInd/>
                <spacing/>
                <rPr>
                    <rFonts/>
                    <b/>
                    <bCs/>
                    <lang/>
                </rPr>
            </pPr>
            <r>
                <rPr>
                    <rFonts/>
                    <b/>
                    <bCs/>
                    <lang/>
                </rPr>
                <t>Title</t>
            </r>
        </p>
    </body>
</document>

Как я могу удалить некоторые теги, не затрагивая и не удаляя текст внутри, это мой ожидаемый результат после xslt

<document><body><p>Title</p></body></document>

person LiXin    schedule 09.02.2015    source источник
comment
Не могли бы вы опубликовать свою попытку.   -  person Lingamurthy CS    schedule 09.02.2015
comment
Пожалуйста, не задавайте один и тот же вопрос дважды! stackoverflow.com/questions/28362715/   -  person michael.hor257k    schedule 09.02.2015


Ответы (3)


Вы можете использовать это:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>
<xsl:template match="p">
    <xsl:copy>
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>
person Lingamurthy CS    schedule 09.02.2015

По сути, вы можете следовать одной из двух стратегий:

  1. Начните с шаблона преобразование идентичности, который копирует все по умолчанию; затем добавьте шаблоны для соответствия любым узлам, которые вы хотите изменить в качестве исключения; Это то, что вы начали делать - теперь вам нужно только добавить пустые шаблоны, чтобы удалить ненужные узлы.

  2. Выберите только те узлы, которые вам нужны; поскольку есть только один, в этом случае это будет, безусловно, предпочтительная стратегия:

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:template match="/">
    <p>
        <xsl:value-of select="document/body/p/r/t" />
    </p>
</xsl:template>

</xsl:stylesheet>

возвращая результат:

<?xml version="1.0" encoding="UTF-8"?>
<p>Title</p>

Вышеприведенное предполагает, что вам действительно нужно конкретное значение элемента <t>, а не просто любые текстовые узлы, которые оказались потомками элемента <p> вашего ввода. Если это предположение неверно, сделайте следующее:

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="/">
    <p>
        <xsl:value-of select="document/body/p" />
    </p>
</xsl:template>

</xsl:stylesheet>
person michael.hor257k    schedule 09.02.2015

Это мой ответ, и это хорошо для меня.

<xsl:template match="//*/text()">
  <xsl:if test="normalize-space(.)">
    <xsl:value-of select=
     "concat(normalize-space(.), '&#xA;')"/>
  </xsl:if>

  <xsl:apply-templates />
</xsl:template>

Я использовал этот, и теперь моя проблема в том, как удалить теги с пустым значением.

<p/>

Как я могу удалить этот тег после преобразования? Спасибо

person LiXin    schedule 09.02.2015