2016-10-27 73 views
2

我有一個XML文件(的test.xml)看起來是這樣的:XML轉換成簡單的文件使用XSLT UNIX

<hudson> 
<job> 
<name>cedge</name> 
</job> 
<job> 
<name>techM</name> 
</job> 
<job> 
<name>infy</name> 
</job> 
<job> 
<name>DevP</name> 
<job> 
<name>line</name> 
<nextBuildNumber>14</nextBuildNumber> 
</job> 
<job> 
<name>ment</name> 
<nextBuildNumber>85</nextBuildNumber> 
</job> 
<job> 
<name>FreeS</name> 
<nextBuildNumber>96</nextBuildNumber> 
</job> 
<job> 
<name>test</name> 
</job> 
</job> 
<job> 
<name>Email</name> 
</job> 
<job> 
<name>investigate</name> 
<nextBuildNumber>26</nextBuildNumber> 
</job> 
<job> 
<name>Java</name> 
</job> 
<job> 
<name>Tools</name> 
</job> 
</hudson> 

需要輸出的文件,如:

"line" "14" 
"ment" "85" 
"FreeS" "96" 
"investigate" "26" 

與嘗試以下計算策略

xsltproc x.xslt test.xml 

做出x.xslt這樣的:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="//job"> 
"<xsl:value-of select="name"/>" = "<xsl:value-of select="nextBuildNumber"/>" 
</xsl:template> 
</xsl:stylesheet> 

只得到

"investigate" = "26" 
空白值一起

。如果沒有從「job-Devp」標籤獲取數據,任何幫助都將被處理。

回答

3

您的XSLT並不完全產生你說你得到的輸出,因爲它也將輸出線直接所有job元素的根hudson下,這樣的..

"cedge" = "" 

此外,當你匹配job元素,則不會通過選擇這些元素的任何後代job繼續處理,因此嵌套的job元素不會被拾取。

可能做的僅僅是添加了文檔節點匹配模板\特別選擇您需要的所有作業元素(即nextBuildNumber

的那些試試這個XSLT

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

<xsl:output method="text" /> 

<xsl:template match="/"> 
    <xsl:apply-templates select="//job[nextBuildNumber]" /> 
</xsl:template> 

<xsl:template match="job"> 
    <xsl:text>"</xsl:text> 
    <xsl:value-of select="name"/> 
    <xsl:text>" = "</xsl:text> 
    <xsl:value-of select="nextBuildNumber"/> 
    <xsl:text>"&#10;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 
+0

感謝最容易的事@TimC的答覆,它的工作:) :) :) 在我的問題部分有一個「空間」之間的「選擇」字符串中的「x.xslt」文件。這是我的不好之處。我用正確的代碼編輯了問題。 – joy