2012-07-22 40 views
0

我想從一個XML(XHTML)文件更改爲另一個。在新的XML文件中,我必須刪除/添加/修改某些元素。爲此,我創建了一個identity.xsl文件,該文件複製整個源文件,然後創建了一個新的XSLT,其中包括identity.xsl,然後在新的XSLT中嘗試進行修改。我可以通過傳遞模板匹配來消除一些不需要的屬性,但是我無法在現有標記中添加新屬性,也無法在特定位置添加新元素(在特定位置關閉標籤)。使用XSLT-從XML到XML使用XSLT添加,移除,修改元素和屬性

我原來的文件:

<?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 id="o"> 
    <div id="nd"> 
     <p>1</p> 
    </div> 

    <div class="TF id="id12"> 
     <element1 name="abc" src="abc.jpg"></script> 
     <input type="radio" id="1" event="xyz"> 
     <div class="q"> 
     <br/> 
     <div id="ta3" class="block"> 
      <span style="a">ABC</span> 
     </div> 
     <br/>T <input/> F <input/> 
     <div id="sf"> 
      <div id="ta3"> 
      </div> 
     </div> 
     </div> 
    </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> 

<!--HAVE TO AD THESE TWO ELEMENTS--> 
<element add="xyz" id="23"> 
<element add="xyz" id="24"> 

<!--ADD ATTRIBUTES IN BODY TAG--> 
<body onLoad="ada" bgcolor="pink"> 

    <div id="o"> 
    <div id="nd"> 
     <p>1</p> 
    </div> 

    <div class="TF id="id12"> 

     <!--HAVE TO UPATE THE VALUE OF SRC ATTRIBUTE --> 
     <element1 name="abc" src="xyz.jpg"></script> 

     <!--ADD THIS FORM ELEMENT WITH ATTRIBUTE--> 
     <form name="form"> 
     <input type="radio" id="1" event="xyz"> 
     <div class="q"> 
      <br/> 
      <div id="ta3" class="block"> 
      <span style="a">ABC</span> 
      </div> 

      <br/>T 
      <!--ADD TABLE/TR/TD TAG--> 
      <table> 
      <tr> 
       <td> 
       <input/> 
       </td> 
      </tr> 
      <tr> 
       </td> 
       F <input/> 
       </td> 
      </tr> 
      </table> 

      <div id="sf"> 
      <div id="ta3"> 
      </div> 
      </div> 
     </div> 

     <!--ADD INPUT TAG--> 
     <input type="submit" value="Done"/> 

     </div> 
    </div> 

    <!--CLOSE FORM TAG--> 
    </form> 
</div> 
</body> 
</html> 

XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <!-- Import the identity transformation. --> 
    <xsl:import href="identity.xsl"/> 

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

    <xsl:template match="body"> 
    <body onLoad="ada" bgcolor="pink"></body> 
    </xsl:template> 

    <!--REMOVES THE MATCHING ATTRIBUTE and DOES THE JOB--> 
    <xsl:template match="@attr"> </xsl:template> 

    <xsl:template match="input"> 
    <xsl:element name="input"> 
     <xsl:attribute name="type">submit</xsl:attribute> 
     <xsl:attribute name="value">Done</xsl:attribute> 
     <xsl:apply-templates /> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 
+0

您能更具體地瞭解您遇到的問題嗎? – 2012-07-22 01:33:20

+0

@Michael我無法添加具有屬性的新元素並向現有元素添加新屬性。但是,我可以刪除/更新屬性。例如 - 我必須在head標籤後添加兩個元素,並將新屬性添加到body標籤,但我無法做到這一點。 – RahulD 2012-07-22 01:35:41

+0

您輸入XML時存在一些錯誤。例如,腳本標記不平衡。請糾正,以便我們瞭解您的意圖。 – 2012-07-22 04:50:22

回答

2

您的輸入文檔充滿了形成錯誤,我不得不冒險猜測您的意圖。請參閱下面的轉換解決方案。我故意沒有在你的評論「ADD TABLE/TR/TD TAG」中插入表格元素,因爲這部分看起來很瘋狂,以至於我在這裏爲你提供的任何解決方案都可能是你所需要的規則的錯誤解釋轉型。

這XSLT 1.0樣式表...

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xhtml="http://www.w3.org/1999/xhtml" 
xmlns="http://www.w3.org/1999/xhtml" 
exclude-result-prefixes="xhtml"> 
<xsl:output method="xml" indent="yes" encoding="UTF-8"/> 
<xsl:strip-space elements="*" /> 

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

<xsl:template match="xhtml:body"> 
    <element add="xyz" id="23" /> 
    <element add="xyz" id="24" /> 
<body onLoad="ada" bgcolor="pink"> 
    <xsl:apply-templates select="@*|node()"/> 
    </body> 
</xsl:template> 

<xsl:template match="xhtml:element1[@name='abc']/@src"> 
    <xsl:attribute name="src">xyz.jpg</xsl:attribute> 
</xsl:template> 

<xsl:template match="xhtml:input[@id='1']"> 
    <form name="form"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    <xsl:apply-templates select="following-sibling::xhtml:div[1]" mode="inside-form"/> 
    </form> 
</xsl:template> 

<xsl:template match="xhtml:div[ preceding-sibling::xhtml:*[1] 
    /self::xhtml:input[@id='1']]"/> 

<xsl:template match="xhtml:div" mode="inside-form"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
</xsl:copy> 
<input type="submit" value="Done"/> 
</xsl:template> 

</xsl:stylesheet> 

...將藉此輸入文檔...

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
</head> 
<body> 
<div id="o"> 
    <div id="nd"> 
    <p>1</p> 
    </div> 
    <div class="TF" id="id12"> 
    <element1 name="abc" src="abc.jpg"/> 
    <input type="radio" id="1" event="xyz"/> 
    <div class="q"> 
    <br/> 
    <div id="ta3" class="block"> 
    <span style="a">ABC</span> 
    </div> 
    <br/>T <input/> F <input/> 
    <div id="sf"> 
    <div id="ta3"> 
    </div> 
    </div> 
    </div> 
    </div> 
</div> 
</body> 
</html> 

...和屈服此輸出證件...

<?xml version="1.0" encoding="utf-8"?> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
    </head> 
    <element add="xyz" id="23" /> 
    <element add="xyz" id="24" /> 
    <body onLoad="ada" bgcolor="pink"> 
    <div id="o"> 
     <div id="nd"> 
     <p>1</p> 
     </div> 
     <div class="TF" id="id12"> 
     <element1 name="abc" src="xyz.jpg" /> 
     <form name="form"> 
      <input type="radio" id="1" event="xyz" /> 
      <div class="q"> 
      <br /> 
      <div id="ta3" class="block"> 
       <span style="a">ABC</span> 
      </div> 
      <br />T <input /> F <input /><div id="sf"><div id="ta3" /></div></div> 
      <input type="submit" value="Done" /> 
     </form> 
     </div> 
    </div> 
    </body> 
</html> 
+0

@SeanBDurkin非常感謝您的回覆。我會按照你提到的方式去做。再次感謝。 – RahulD 2012-07-22 14:12:41

+0

非常感謝它,它完美的作品。現在我可以嘗試一些修改。 :) – RahulD 2012-07-22 21:26:45

+0

我有一個問題。就像在上面的源代碼XHTML中一樣,有一個 ,而在我的完整源代碼文件中,我還有一個像和一個裏面的'head'標籤,比如,所以當我應用上面的XSLT時,它會在任何地方改變源的值,並將其設置爲xyz.jpg,而我只能更改src =「abc.jpg」的位置。 – RahulD 2012-07-23 00:08:13

0

就個人而言,我不能忍受XSLT。閱讀太難了。

我的首選是創建一個我想生成的XML的Velocity模板,並使用Velocity從舊的XML映射到新的。它更容易可視化和工作。

+0

感謝您的回覆。我不熟悉XSLT的Velocity模板。你能否建議我該怎麼做? – RahulD 2012-07-22 01:40:42

+0

檢查超鏈接並開始閱讀如何使用Velocity。這相對容易。 – duffymo 2012-07-22 01:43:43

+0

感謝您的鏈接! – RahulD 2012-07-22 01:45:57