2011-07-20 49 views
0

我可以使用一些幫助與我的XML轉換XML格式和可重用性,我認爲其他類似的問題,但因爲我的XML模式是我在應用它的麻煩有點尷尬。XSLT-更改

這裏是XML格式,我有

<root> 
    <row> 
    <var name="Name" value="Rusell" /> 
    <var name=" Surname" value=" Anthony" /> 
    <var name=" Country" value=" UK" /> 
    <var name=" Job" value="Web Designer" /> 
    <var name=" Cabin" value="345" /> 
</row> 
    <row> 
    <var name="Name" value="Wolf" /> 
    <var name=" Surname" value=" Werner" /> 
    <var name=" Country" value=" Germany" /> 
    <var name=" Job" value="Linux IT" /> 
    <var name=" Cabin" value="234" /> 
</row> 
</root> 

而這正是我希望它看起來像這樣我可以輕鬆地訪問領域。

<root> 
<row name="Rusell" surName="Anthony" country="UK" job="Web Designer" cabin="345" /> 
<row name="Wolf" surname="Werner" country="Germany" job="Linux IT" cabin="234" /> 
</row> 

至於格式化的進行,這是我所擁有的遠這樣的值沒有插入,我已經取得了進展。

<root> 
<row Name="" Surname="" Country="" Job="" Cabin="" /> 
<row Name="" Surname="" Country="" Job="" Cabin="" /> 
<row Name="" Surname="" Country="" Job="" Cabin="" /> 
<row Name="" Surname="" Country="" Job="" Cabin="" /> 
</root> 

這裏是我的XSLT文件 - 利用價值的選擇我有不同的語法,這是隻是爲了顯示我曾嘗試時,您會發現一對夫婦的屬性。

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

</root> 
</xsl:template> 

<xsl:template match="row"> 

<row> 
<xsl:attribute name="Name"> 
<xsl:value-of select="value"/> 

</xsl:attribute> 
<xsl:attribute name="Surname"> 
<xsl:value-of select="row/root/name/value"/> 

</xsl:attribute> 
<xsl:attribute name="Country"> 
<xsl:value-of select="root/row/value"/> 

</xsl:attribute> 
<xsl:attribute name="Job"> 
<xsl:value-of select="@value"/> 

</xsl:attribute> 
<xsl:attribute name="Cabin"> 
<xsl:value-of select="value"/> 

</xsl:attribute> 

</row> 

</xsl:template> 

此外,關於重新可用性問題,上述方法是好的,當我知道的字段和屬性,但我將採取不同的XML文件有可能更多的領域即地址,年齡。

那麼我將如何去創造一個XSLT文件,做了以下內容:

For each Node = root/row 
Create row = ([email protected] & [email protected]) 

IE一樣東西我想上面的事,但可重複使用的,如我不需要知道名字的值(姓,機艙等),所以它適用於我的第一個XML文件,以下。

<root> 
    <row> 
    <var name="differentName" value="x" /> 
    <var name="anotherdifferentname" value="y" /> 
</row> 
    </root> 

如果我需要更清楚,請讓我知道,並提前致謝。

+0

你已經給出答案,但有時候我覺得告訴人們他們做錯了什麼是更重要的。基本上你的路徑遍佈整個地方,它們看起來像是瘋狂的猜測。在符合行模板,路徑安東尼'變種[@名稱=「姓」]/@ value' - 也就是說,選擇子「VAR」元素,其「name」屬性等於「姓」,然後選擇這個'var'元素的'value'屬性。 –

+0

是的,我讚賞你的批評,我對XSL無能爲力,這對你來說可能是顯而易見的。謝謝你解釋語法 – user123

+0

@Michael Kay - 如果你給你的評論一個答案,這樣我們就可以對它進行投票(是的,我知道OP已經接受了另一個,但你的解決方案更合適)。 – Perception

回答

1

這應該這樣做

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl" 
> 
    <xsl:output method="xml" indent="yes"/> 

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

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

    <xsl:template match="var"> 
    <xsl:variable name="attributeName" select="@name"> 
    </xsl:variable> 
    <xsl:attribute name="{$attributeName}"> 
     <xsl:value-of select="@value"/> 
    </xsl:attribute> 
    </xsl:template> 
</xsl:stylesheet> 
+0

太好了,我還沒有測試這但我將很快,但你已經制定了對我的語法無論感謝很多 – user123

+0

歡迎您。 –

+0

不客氣。 –