提取xml元素和子节点值

时间:2013-04-25 00:47:19

标签: xslt xml-parsing

我有一个类型

`<ns:response>
 <ns:transport_car>
  <ns:transport_model> abc</ns:transport_model>
  <ns:transport_model> xyz</ns:transport_model>
   </ns:transport_car>
    </ns:response>`

如何格式化此xsl以打印表单文本:

Transport type= car
Model name:
abc xyz

2 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ns="some:ns">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*/*[starts-with(local-name(), 'transport_')]">
  <xsl:text>Transport type= </xsl:text>
  <xsl:value-of select="substring-after(local-name(), 'transport_')"/>
  <xsl:apply-templates/>
 </xsl:template>

 <xsl:template match="ns:transport_model[1]">
Model name:
<xsl:value-of select="normalize-space()"/>
 </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档时:

<ns:response xmlns:ns="some:ns">
    <ns:transport_car>
        <ns:transport_model> abc</ns:transport_model>
        <ns:transport_model> xyz</ns:transport_model>
    </ns:transport_car>
</ns:response>

会产生想要的正确结果:

Transport type= car
Model name:
abc xyz

答案 1 :(得分:0)

这是怎么回事:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:ns="something">
  <xsl:output method="text" indent="yes"/>

  <xsl:template match="/*">
    <xsl:apply-templates
      select="*[substring-after(local-name(), 'transport_') != '']" />
  </xsl:template>

  <xsl:template match="/*/*">
    <xsl:value-of
      select="concat('Transport type= ', 
                     substring-after(local-name(), 'transport_'),
                     '&#xA;Model name:&#xA;')"/>
    <xsl:apply-templates select="ns:transport_model" />
  </xsl:template>

  <xsl:template match="ns:transport_model">
    <xsl:value-of select="concat(normalize-space(), ' ')"/>
  </xsl:template>
</xsl:stylesheet>

在样本输入上运行时(添加名称空间后),结果为:

Transport type= car
Model name:
abc xyz