2012-07-31 77 views
0

我必須使用XSLT從一個XML(XHTML)文件轉換爲另一個XML文件。變換的規則是:使用XSLT將XML轉換爲XML(刪除,添加,更改)

  1. <div id="ta12" class="bl" style="dis:bl">必須與<div class="pass" value="50">
  2. ID =「T0B」和「T1B」的值來替換必須使用id =「ta0b8」和「ta3b8」分別替換。
  3. <input type="radio" name="o0" id="t0"/>必須與<input type="radio" name="key0b8" value="0" id="ta0q" class="block" />(和文件中同樣)代替

輸入文件:

<?xml version="1.0" encoding="utf-8"?> 
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
    <html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    </head> 
    <body> 
     <div class="iDev"> 
     <div id="ta12" class="bl" style="dis:bl"></div> 

     <div class="q"> 
      <div id="t0b" class="block">1<span style="color">TEXT1</span> 
      </div><br /> 
      T <input type="radio" name="o0" id="t0"/> 
      F <input type="radio" name="op0" id="f0"/> 
      <div id="sfb"></div> 
     </div><br /> 

     <div class="q"> 
      <div id="t1b" class="block">2<span style="color">TEXT2</span> 
      </div><br /> 
      T <input type="radio" name="o1" id="t1" /> 
      F <input type="radio" name="op1" id="f1" /> 
      <div id="sfb"></div> 
     </div> 
     </div> 
    </body> 
    </html> 

輸出文件:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
    <div class="iDev"> 
    <div class="pass" value="50"></div> 

    <div class="q"> 
     <div id="ta0b8" class="block">1<span style="color">TEXT1</span> 
     </div><br /> 
     T<input type="radio" name="key0b8" value="0" id="ta0q" /> 
     F<input type="radio" name="key0b8" value="1" id="ta1q" /> 
     <div id="sfb"></div> 
    </div><br /> 

    <div class="q"> 
     <div id="ta3b8" class="block">2 <span style="color">TEXT2</span> 
     </div><br /> 
     T<input type="radio" name="key3b8" value="0" id="ta0q3" /> 
     F<input type="radio" name="key3b8" value="1" id="ta1q3" /> 
     <div id="sfb"></div> 
    </div> 
    </div> 
</body> 
</html> 

在我的XSLT我創建了一個身份模板,其中包括udes整個輸入文件,然後我試圖做所需的修改。我能夠做的第一任務副

<xsl:template match="xhtml:div[@id='ta12']"> 
    <xsl:attribute name="class">pa</xsl:attribute> 
    <xsl:attribute name="value">10</xsl:attribute> 
</xsl:template> 

在其生產所需的Div標籤的輸出,但它消除了<div class="iDev">標籤。任何人都可以告訴我從給定的輸入產生所需輸出的解決方案。感謝您!

+0

[多於一個在XSLT屬性(與身份模板)更換更多]的可能重複(http://stackoverflow.com/questions/11642627 /替換多於一個屬性在xslt-with-identity-template) – 2012-07-31 12:18:59

回答

2

我只是想解決你的第一條規則,因爲這似乎是你的問題的焦點。如果您需要規則2和規則3的幫助,請向他們提出單獨的問題。

一般而言,XSLT 1.0複製元素(非深度)的解決方案模式如下所示。非深入的,我的意思是放棄任何子節點。

清單1

<xsl:template match="some-element-pattern"> 
    <xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:attribute name="my-attrib-to-set">value-to-set</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 

或者,你可以更換的xsl:複製與XSL:申請模板,如果有其他的處理是直接拷貝一些潛在的其他屬性。 xsl:apply-templates是更通用的形式。

因此應用這種解決方案模式,以你的情況,你想要的是模板...

清單2

<xsl:template match="xhtml:div[@id='ta12']"> 
    <xsl:copy> 
    <xsl:copy-of select="@*" /> 
    <xsl:attribute name="class">pa</xsl:attribute> 
    <xsl:attribute name="value">10</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 

NB。在以前的解決方案,我可以給你這種低效的模板......

清單3

<xsl:template match="xhtml:div[@id='ta12']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*[not(@class)]" /> 
    <xsl:attribute name="class">pa</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 

我現在認識到這是錯誤的。謂詞not(@class)是無意義的並且總是返回true,因爲當焦點項是屬性時,屬性:: axis總是返回一個空序列。列表3背後的思想是在匹配的輸入div元素具有class屬性的情況下,消除class屬性的無關處理。如果您真的想在清單2中獲得這種效率,請參閱XSLT 1。0,你可以做爲清單4,但代碼是一些 - 什麼醜陋的,我不知道它是值得的。

清單4

<xsl:template match="xhtml:div[@id='ta12']"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*[local-name()!='class'] 
            [local-name()!='value']" /> 
    <xsl:attribute name="class">pa</xsl:attribute> 
    <xsl:attribute name="value">10</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 

上市4只適用於類和值在空命名空間之中。如果有問題的屬性位於命名空間中,則需要進行一些更改。

這裏是您的最終選擇。如果您準備犧牲xsl:copy的普遍性並想要吸取屬性值模板的多汁骨髓,您可以使用清單5.在清單5中,您可以用屬性值模板替換'pa'和'va' , 按要求。此解決方案的另一個缺點是,現在必須確保@class和@value屬性不在子xsl:apply-templates內處理,或者它們將覆蓋預期的文字值。

清單5

<xsl:template match="xhtml:div[@id='ta12']"> 
    <xhtml:div class="pa" value="va"> 
    <xsl:apply-templates select="@*[local-name()!='class'] 
            [local-name()!='value']" /> 
    </xhtml:div> 
</xsl:template> 

最後,我知道你是隻在XSLT 1.0感興趣,但只是有點好玩,我會提到的解決方案的一般模式爲XSLT 2.0。這顯示在列表6.

清單6

<xsl:template match="some-element-pattern"> 
    <xsl:copy> 
    <xsl:apply-templates select="@* except @my-attrib-to-set" /> 
    <xsl:attribute name="my-attrib-to-set">value-to-set</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
+1

其實,@Rahul,我沒有回答你的問題在http://stackoverflow.com/questions/11642627? – 2012-07-31 06:28:48

+0

非常感謝您的回覆。 :)是的,你回答了問題的第一部分,但在這裏我也改變了我提出的那個問題的輸入。根據你的建議,我試圖讓它更通用(2和3)。我會問他們作爲一個單獨的問題。再次感謝您的幫助。 :) – RahulD 2012-07-31 13:13:03

+0

請參閱這裏http://stackoverflow.com/questions/ask我已經發布了規則2和3所述的新問題。再次感謝。期待您的幫助。 – RahulD 2012-07-31 13:38:09