2011-05-24 109 views
5

我的xml文件如下所示。如何在xml中使用xsl替換另一個標籤中的標籤

<rule> 
    <name>86</name> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
</rule> 

我需要brlName更換名字,我需要添加另一個標籤作爲drlName.The輸出應該看起來像下面。

<rule> 
    <brlName>86</brlName> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
    <drlName>86_1.0</drlName> 
</rule> 

請幫我用相應的xsl來獲得所需的輸出。 讚賞你的幫助!

+0

好問題,+1。查看我的答案,獲得基於最基本且功能強大的XSLT設計模式的完整,簡短易用的解決方案 - 使用並覆蓋身份規則/模板。 – 2011-05-25 04:10:00

+0

爲什麼有些人提出問題,並在收到後讓我說,好的答案,不要提供任何反饋?這在某個時候非常惱人。 – 2011-05-25 19:57:24

+0

歡迎來到Stack Overflow,empo。 – Flynn1179 2011-05-26 06:59:38

回答

5

這是標識轉換的典型任務(下面轉換中的第一個模板規則)。只有兩個覆蓋(最後兩條規則)。


XSLT 1.0下測試撒克遜6.5.5

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="name"> 
     <brlName><xsl:value-of select="."/></brlName> 
    </xsl:template> 

    <xsl:template match="brlVersion"> 
     <xsl:copy-of select="."/> 
     <drlName><xsl:value-of select="preceding-sibling::name"/>_1.0</drlName> 
    </xsl:template> 

</xsl:stylesheet> 
2

該轉化

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

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

<xsl:template match="/*/*[last()]"> 
    <xsl:call-template name="identity"/> 
    <drlName>86_1.0</drlName> 
</xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔施加:

<rule> 
    <name>86</name> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
</rule> 

產生想要的,正確的結果:

<rule> 
    <brlName>86</brlName> 
    <ruleId>100</ruleId> 
    <ruleVersion>1.0</ruleVersion> 
    <brlVersion>1.0</brlVersion> 
    <drlName>86_1.0</drlName> 
</rule> 

說明

  1. 使用並重寫身份規則/模板 - 最基本也是最強大的XSLT設計模式。

  2. 覆蓋名爲name的任何元素並創建名爲brlName(重命名)的元素。

  3. 覆蓋頂部元素的最後一個元素子元素。根據需求調用此節點的名稱標識規則(複製),然後使用特定的文本節點子元創建名爲drlName的元素。

使用和覆蓋身份規則/模板是最基本和最強大的XSLT設計模式。你可以瞭解更多關於它here

相關問題