2012-04-08 45 views
1

如果存儲屬性文件的XML格式,例如XSL文件

<Properties> 
    <Property value="abc">ABC1</Property> 
    <Property value="...">...</Property> 
</Properties> 

然後我們可以使用xslt處理兩個(屬性,輸入)XML文件,並用ABC1(自定義輸出xml文件的)abc元素(輸入xml文件)替換abc元素,等等。

例如考慮我下面輸入XML文件

<?xml version="1.0" encoding="UTF-8"?> 
     <Content> 
      <abc>xxx 
       <def>zzz 
        <ghi>ccc</ghi>ttt 
        <dynamic val="hello" xmlns="http://abc.com" /> 
         world 
        <dynamic val="hi" xmlns="http://abc.com" /> 
         <dynAttr> 
         <dyn value=123 /> 
         <dyn value=222 /> 
         </dynAttr> 
         <lmn>data</lmn> 

        </def> 
       </abc> 
     </Content> 

與屬性文件由輸入XML文件的每個標籤定義的屬性,如果沒有屬性,用於輸入XML文件的標籤然後轉化XML標記定義與輸入xml文件標籤相同的標籤名稱。使用XSLT和寫入其指的屬性xml文件,並且當在給定的輸入XML文件和結果在轉化的xml文件應用爲所示的XSL文件

<?xml version="1.0" encoding="UTF-8"?> 
<Properties> 
      <Property value="Content">CONTENT12</Property> 
      <Property value="abc">ABC1</Property> 
      <Property value="def">www</Property> 
       <Property value="ghi">yyy</Property> 
      <Property value="dynamic">Dynamic1</Property> 
      <Property value="dynAttr">DynAttribute</Property> 
</Properties> 

<?xml version="1.0" encoding="UTF-8"?> 

       <www>zzz 
        <yyy>ccc</yyy>ttt 
        <Dynamic1 val="hello" xmlns="http://abc.com>hello</Dynamic1> 
         world 
        <Dynamic1 val="hi" xmlns="http://abc.com>hi</Dynamic1> 
         <DynAttribute> 
         <dyn>123</dyn> 
         <dyn>222</dyn> 
         </DynAttribute> 
         <lmn>data</lmn> 
        </www> 
if the above code is my requirement then what must be the relative xpath expression in your answer <xsl:template match=" "> 
+0

@ Maestro13:喜做你有任何解決方案上述問題 – 2012-04-08 12:50:05

回答

2

你的示例文件不是良好的,但如果你解決這個問題,和你的屬性文件是prop.xml,這應該工作:

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 

您的問題不說什麼命名更名的元素應該是在ABO ve代碼總是把它們放在沒有名字空間的地方。如果你想他們是在同一個命名空間爲原型改變了xsl:元素線

<xsl:element name="{$new}" namespace="{namespace-uri()}"> 

最靈活的選擇很可能會同時指定本地名稱和命名空間URI的屬性文件。

更新

如果在評論指出,你想按如下方式保存命名空間和只處理def元素,然後稍作修改更新的答案:

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 


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

<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}" namespace="{namespace-uri()}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 
+0

感謝您的回覆。但是當我們使用copy-of或任何複製標籤時,我還會得到與輸入xml文件相關的另一個命名空間,而不是所需的命名空間,您可以建議任何替代方法嗎? – 2012-04-08 15:47:14

+0

我上面使用的唯一副本是複製屬性。您沒有提供任何需要更改屬性名稱的指示,或者如果您在源文件中有名稱空間,您想如何將元素名稱與您的屬性文件進行匹配(使用名稱空間URI並忽略前綴或者如上所述忽略命名空間uri和包含前綴的名稱上的匹配)如果編輯問題給出命名空間使用的指示,如果它仍不適合,我會修改我的答案。 – 2012-04-08 16:20:58

+0

@ David Carlisle:謝謝,代碼工作正常,但是我可能知道它匹配的是什麼。這意味着它匹配輸入xml的每個節點。 – 2012-04-09 06:23:04