2016-05-10 53 views
1

我正在將TEI XML轉換爲XHTML。只有當它存在於當前節點時,我需要將xml:lang屬性轉換爲lang屬性。我嘗試了一些笨拙的東西,如:如何只包含@xml:lang屬性?

<xsl:template match="tei:p"> 
    <xsl:element name="p"> 
     <xsl:attribute name="lang"> 
      <xsl:value-of select="./@xml:lang"/> 
     </xsl:attribute> 
     <xsl:apply-templates/> 
    </xsl:element> 
</xsl:template> 

...但我想堅持最佳實踐。如何簡單地使用xml:lang屬性並將其轉換爲lang屬性?當然,如果它不存在,請不要使用它。

我已經加入了著名的身份規則我的模板(這裏according to Michael Kay),但它什麼都不做:

<!-- Identity Rule --> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@xml:lang"> 
    <xsl:attribute name="lang"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 

我想我不正確理解規則。

我想使用的任何標記,如:

<p xml:lang="en"> 
    <seg xml:lang="fr">XYZ</seg> otherwise English. 
</p> 

預期輸出:

<p lang="en"> 
    <seg lang="fr">XYZ</seg> otherwise English. 
</p> 

回答

2

您的身份模板還應該處理子節點,否則將停止在第一個匹配的節點:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="@xml:lang"> 
    <xsl:attribute name="lang"> 
     <xsl:value-of select="."/> 
    </xsl:attribute> 
</xsl:template> 
+0

謝謝,實際上,我認爲這個解決方案比來自@TimC的解決方案更清潔,但是這個解決方案不起作用。如果我使用進口產品,有什麼具體的地方需要注意嗎?還是它具有較低的優先級? –

+0

哦,我看到它的作品**與@TimC的答案!這意味着這兩個答案是解決方案。 –

+0

命令'@ * | node()'是否重要?或者也有可能'node()| @ *'? –

2

如果您有現有的模板匹配tei:p那麼這將優先於身份模板。您目前的模板確實爲<xsl:apply-templates />,但這相當於<xsl:apply-templates select="node()" />。它不處理屬性。

您需要做的是將當前的xsl:attributes替換爲xsl:apply-templates,而不是選擇@xml:lang屬性,從而允許相關模板與其匹配。

<xsl:template match="tei:p"> 
    <p> 
     <xsl:apply-templates select="./@xml:lang"/> 
     <xsl:apply-templates/> 
    </p> 
</xsl:template> 

所以,如果@xml:lang不存在,沒有被選中,並且沒有屬性被創建。

+0

正如我寫了下面的答案從@ har07,他和你的回答在某種程度上一起工作。我認爲這已經解決,但真的不知道誰是贏家。 –

+1

隨意接受@ har07的回答,那很好。他發現了我錯過的關鍵點。 –

相關問題