使用xslt unix将xml转换为简单文件

时间:2016-10-27 06:51:45

标签: xml bash shell unix xslt

我有一个xml文件(test.xml)如下所示:

<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"

尝试下面的approch

 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"

以及空白值。没有从&#34; job-Devp&#34;标签 任何帮助都会得到满足。

1 个答案:

答案 0 :(得分:4)

你的XSLT并没有完全产生你得到的输出,因为它也会直接输出根job下所有hudson个元素的行,就像这样..

 "cedge" = ""

此外,当您匹配job元素时,您不会通过选择那些元素的后续job元素继续处理,因此嵌套的job元素不会被拾取。 / p>

最简单的做法是简单地添加一个与文档节点\匹配的模板,并专门选择所需的所有工作元素(即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>