2013-01-09 81 views
1

我有這樣的XML文檔:XSL消除元素

<tags> 
<w lemme="déclaration" pos="NOM">Déclaration</w> 
<w lemme="du" pos="PRP:det">des</w> 
<w lemme="droit" pos="NOM">droits</w> 
<w lemme="de" pos="PRP">de</w> 
<w lemme="le" pos="DET:ART">l'</w> 
<w lemme="homme" pos="NOM">homme</w> 
<w lemme="et" pos="KON">et</w> 
<w lemme="," pos="PUN">,</w> 
... 
</tags> 

我試圖使用XSL過濾掉的文章和標點符號。像這裏< w lemme =「,」pos =「PUN」>,</w>和< w lemme =「de」pos =「PRP」> de </w> < w lemme =「le」pos =「DET :ART「>'</w>。因此,我製作了以下樣式表,它將所有條件概括爲所有標籤,包括標籤<標籤>。

<xsl:template match="*"> 
<xsl:choose> 
<xsl:when test="contains(@pos,'PUN')"></xsl:when> 
<xsl:when test="contains(@pos,'PRP')"></xsl:when> 
<xsl:when test="contains(@pos,'DET')"></xsl:when> 
<xsl:otherwise> 
<xsl:copy> 
<xsl:attribute name="lemme"> 
<xsl:value-of select="@lemme"/> 
</xsl:attribute> 
<xsl:attribute name="pos"> 
<xsl:value-of select="@pos"/> 
</xsl:attribute> 
<xsl:apply-templates/> 
</xsl:copy> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:template> 

我有這樣的結果:

<tags lemme="" pos=""> 
<w lemme="déclaration" pos="NOM">Déclaration</w> 
<w lemme="droit" pos="NOM">droits</w> 
<w lemme="homme" pos="NOM">homme</w> 
<w lemme="et" pos="KON">et</w> 
<w lemme="citoyen" pos="NOM">citoyen</w> 

所以它的工作原理,並顯示我的只有我感興趣的線路,只有我不希望它也加入還是讓我=「」 POS =「」在第一行的<標籤>標籤中。我應該在xsl中更改哪些內容才能使其僅使用< w>標記。我試過< xsl:template match =「w」>但它沒有生成有效的xml。請幫助?

+2

您能重新格式化您的問題嗎?你的代碼塊不可讀... –

+0

是的,我很抱歉,現在好多了我認爲 – user1964684

回答

1

你應該使用標準的身份轉換,這是這個模板:

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

您可以隨時使用這個一切從源頭上輸出複製。例外情況由額外的模板處理,如下所示:

<xsl:template match="w[contains(@pos,'PUN')] 
        |w[contains(@pos,'PRP')] 
        |w[contains(@pos,'DET')]"/> 

它什麼都不做。它只是匹配不需要的元素,並防止身份轉換模板匹配和複製它們。完整的樣式表如下所示:

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

    <xsl:template match="w[contains(@pos,'PUN')] 
         |w[contains(@pos,'PRP')] 
         |w[contains(@pos,'DET')]"/> 
</xsl:stylesheet> 
+0

+1用於基於身份轉換來建議解決方案,從而減少複製樣板。 – Cumbayah

+0

是的!謝謝,這是有道理的,它完美的作品! – user1964684

0

有幾種方法來解決這個問題,而是一個方式來增強你已經擁有的是有一個規則匹配和輸出標籤元素,然後將第二模板僅符合W-元素

對於第一位,你有一個前添加這個模板:

<xsl:template match="/tags"> 
<xsl:copy> 
<xsl:apply-templates select="w"/> 
</xsl:copy> 
</xsl:template> 

對於第二位,改變當前模板:

<xsl:template match="w"> 

對於CL元數,這裏是完整的樣式表:

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

    <xsl:template match="/tags"> 
     <xsl:copy> 
      <xsl:apply-templates select="w"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="w"> 
     <xsl:choose> 
      <xsl:when test="contains(@pos,'PUN')"></xsl:when> 
      <xsl:when test="contains(@pos,'PRP')"></xsl:when> 
      <xsl:when test="contains(@pos,'DET')"></xsl:when> 
      <xsl:otherwise> 
       <xsl:copy> 
        <xsl:attribute name="lemme"> 
         <xsl:value-of select="@lemme"/> 
        </xsl:attribute> 
        <xsl:attribute name="pos"> 
         <xsl:value-of select="@pos"/> 
        </xsl:attribute> 
        <xsl:apply-templates/> 
       </xsl:copy> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 

</xsl:stylesheet> 

這將產生預期的結果:

<?xml version="1.0" encoding="utf-8"?> 
<tags> 
    <w lemme="déclaration" pos="NOM">Déclaration</w> 
    <w lemme="droit" pos="NOM">droits</w> 
    <w lemme="homme" pos="NOM">homme</w> 
    <w lemme="et" pos="KON">et</w> 
</tags> 

希望這有助於。

+0

謝謝你的回答。問題是,我確實希望它們成爲輸出的一部分,但僅限於< w>標記,但它還會在第一個母標記中添加屬性。 – user1964684

+0

對不起,我回復得太快,錯過了細節。更新答案。 – Cumbayah

+0

嗯,我不能真正使用兩個不同的,因爲要使用屬性< choose>和< otherwise>我無法在不同模板匹配中分離兩個位。 – user1964684