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

XSLT Keep some elements and remove others

我正在尝试编写一个 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(但它可以是任何未指定的标签)已被删除。

谢谢

如果您知道所有要保留的元素名称(例如 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>

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

你可以这样做:

<?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 or self::domanda1替换self::domanda等等