XSLT保留一些元素并删除其他元素

时间:2015-01-27 10:37:56

标签: xslt

我正在尝试编写一个替换某些预定标签的xslt,并完全删除所有其他标签(但递归地将相同的规则应用于其内容)。

例如,我想删除除“domanda”之外的所有标签。如果有一个我想删除的标记(例如“risposta”),并且它包含一个“domanda”标记,我期望的结果是递归地将相同的规则应用于“risposta”元素的内容:必须删除“risposta”标签,但必须保留其所有文字内容和“domanda”标签。

到目前为止,我提出了以下(标准)xslt,它复制了所有元素并转换了名为“domanda”的元素。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>


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

    <xsl:template match="domanda">
        <DOMANDA>
            <xsl:copy-of select="./node()"/>
        </DOMANDA>
    </xsl:template>

        <xsl:template match="p">
            <p>
                <xsl:copy-of select="./node()"/>
            </p>
        </xsl:template>

</xsl:stylesheet>

如何使用删除所有未指定标记的规则完成此xslt?

输入示例:

<testo>
        <p class="p@2">«È una vittoria schiacciante, politicamente schiacciante.
            Al di là dei numeri parlamentari, cioè della possibilità che Syriza
            abbia la maggioranza assoluta». Nichi Vendola, leader di Sel, è
            ovviamente raggiante per la vittoria del leader della sinistra greca.
        </p>
        <domanda class="domanda">Vendola, qual è il segnale che arriva dal
            risultato greco?</domanda>
        <risposta class="risposta">«Il mio primo pensiero va alla riscossa di un
            popolo umiliato dalle politiche dell’austerity europea. La democrazia
            riaggancia la vita e la rappresenta. E apre la possibilità di ridare
            speranza a questa Europa rinchiusa nelle sue politiche, micidiali per
            i popoli e sterili per il futuro».</risposta>
        <domanda class="domanda">Finora però non sembrava che il mondo della
            sinistra europea guardasse con ottimismo alla Grecia di Syriza.
        </domanda>
        <risposta class="risposta">«Invece l’intero Partito del socialismo
            europeo ha tifato nell’ombra proprio per Tsipras. Sperano in Tsipras
            perché sono consapevoli del disastro che ha provocato il rigore
            voluto dalla Merkel, c’è una <p>HELLOOOOOOO</p>voragine sociale che si è aperta sotto i
            piedi della democrazia. Qualsiasi sinistra, anche la più moderata,
            non può non rendersene conto. E non può non vedere che la Grecia apre
            uno spiraglio».</risposta>
        <domanda class="domanda">Tsipras come un cavallo di Troia, per restare
            in tema?</domanda>
        <risposta class="risposta" id="U10401624295425M7">«Semmai come Enea che si carica
            sulle spalle il vecchio padre e ricomincia il viaggio, un nuovo
            inizio».</risposta>

</testo>

预期输出(指定我要在<domanda>中翻译<DOMANDA>并保留<testo><p>标记):

<testo>
        <p class="p@2">«È una vittoria schiacciante, politicamente schiacciante.
            Al di là dei numeri parlamentari, cioè della possibilità che Syriza
            abbia la maggioranza assoluta». Nichi Vendola, leader di Sel, è
            ovviamente raggiante per la vittoria del leader della sinistra greca.
        </p>
        <DOMANDA class="DOMANDA">Vendola, qual è il segnale che arriva dal
            risultato greco?</DOMANDA>
            «Il mio primo pensiero va alla riscossa di un
            popolo umiliato dalle politiche dell’austerity europea. La democrazia
            riaggancia la vita e la rappresenta. E apre la possibilità di ridare
            speranza a questa Europa rinchiusa nelle sue politiche, micidiali per
            i popoli e sterili per il futuro».
        <DOMANDA class="DOMANDA">Finora però non sembrava che il mondo della
            sinistra europea guardasse con ottimismo alla Grecia di Syriza.
        </DOMANDA>
        «Invece l’intero Partito del socialismo
            europeo ha tifato nell’ombra proprio per Tsipras. Sperano in Tsipras
            perché sono consapevoli del disastro che ha provocato il rigore
            voluto dalla Merkel, c’è una <p>HELLOOOOOOO</p>voragine sociale che si è aperta sotto i
            piedi della democrazia. Qualsiasi sinistra, anche la più moderata,
            non può non rendersene conto. E non può non vedere che la Grecia apre
            uno spiraglio».
        <DOMANDA class="DOMANDA">Tsipras come un cavallo di Troia, per restare
            in tema?</DOMANDA>
        «Semmai come Enea che si carica
            sulle spalle il vecchio padre e ricomincia il viaggio, un nuovo
            inizio».

</testo>

risposta(但可以是未指定的任何标签)已被删除。

由于

2 个答案:

答案 0 :(得分:2)

如果您知道要保留的所有元素名称(例如prestop),请以

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

<xsl:template match="@*">
  <xsl:copy/>
</xsl:template>

然后为要转换的元素添加模板

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

但不要包含您先拥有的通用模板。

答案 1 :(得分:2)

您可以这样做:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*" />
    <xsl:output method="xml" indent="yes" encoding="utf-8"/>


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

    <xsl:template match="domanda">
        <DOMANDA>
            <xsl:apply-templates/>
        </DOMANDA>
    </xsl:template>

    <xsl:template match="*[not(self::domanda)]">
        <xsl:apply-templates/>
    </xsl:template>


</xsl:stylesheet>

您可以将self::domanda替换为self::domanda or self::domanda1,依此类推

相关问题