2012-11-29 35 views
1

如果我有下面的XML文檔...將模板應用於文本段落中的元素?

<?xml version="1.0"?> 
<document> 
    <title>Foobar</title> 
    <article> 
    Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
    dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus. 

    <ref url="http://en.wikipedia.org/wiki/FooBar">Foobar</ref> potenti. 
    Duis placerat laoreet est nec fringilla. Quisque vitae semper erat. 
    </article> 
</document> 

...我將如何在article元以下的翻譯?

<p> 
    Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
    dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus. 

    <a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti. 
    Duis placerat laoreet est nec fringilla. Quisque vitae semper erat. 
</p> 

具體來說,它是refa翻譯我很感興趣,因爲它的嵌入式純文本塊內。

回答

4

如果建立在標準XSTL恆等變換,這是一個簡單的任務,你只需要一個模板到裁判元素和輸出匹配一個元素來代替。

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

而更換屬性,你再有另一個模板

<xsl:template match="ref/@url"> 
    <xsl:attribute name="href"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
</xsl:template> 

請注意,如果您裁判元素是保證始終有一個URL屬性,你也可以簡化這兩個模板合併爲一個,如下所示:

<xsl:template match="ref"> 
    <a href="{@url}"> 
     <xsl:apply-templates select="node()"/> 
    </a> 
</xsl:template> 

然後,您將添加ot她的模板可以根據需要替換任何其他元素,例如文章被更改爲p,並且還有一個模板,用於不輸出標題元素。

以下是完整的XSLT

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

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

    <xsl:template match="title" /> 

    <xsl:template match="article"> 
     <p> 
     <xsl:apply-templates /> 
     </p> 
    </xsl:template> 

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

    <xsl:template match="ref/@url"> 
     <xsl:attribute name="href"> 
     <xsl:value-of select="." /> 
     </xsl:attribute> 
    </xsl:template> 

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

當適用於您的示例XML,下面是輸出

<p> 
    Phasellus ultrices arcu suscipit velit laoreet eu dignissim 
    dolor pulvinar. Proin ac libero a diam laoreet iaculis nec eu risus. 

    <a href="http://en.wikipedia.org/wiki/FooBar">Foobar</a> potenti. 
    Duis placerat laoreet est nec fringilla. Quisque vitae semper erat. 
    </p> 
0
<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="/"> 
<xsl:apply-templates select="document"/> 
</xsl:template> 

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

<xsl:template match="title"> 
<xsl:copy-of select="."/> 
</xsl:template> 

<xsl:template match="article"> 
<p> 
<xsl:apply-templates/> 
</p> 
</xsl:template> 

<xsl:template match="ref"> 
<a> 
<xsl:attribute name="href"> 
<xsl:value-of select="@url"/> 
</xsl:attribute> 
<xsl:apply-templates/> 
</a> 
</xsl:template> 
</xsl:stylesheet> 
相關問題