简单的XSLT转换

时间:2018-03-12 07:40:45

标签: xml xslt xpath

我有以下输入文件:

<!-- input.xml --> 
<?xml version="1.0" encoding="UTF-8"?>
<input>
  <value>
    aaa
    <value>
      bbb
      <value>ccc</value>
    </value>
  </value>
</input>

预期产出:

<!-- output.xml --> 
<?xml version="1.0" encoding="UTF-8"?>
<ul>
  <li>aaa</li>
  <li>bbb</li>
  <li>ccc</li>
</ul>

XSLT文件应该如何?我尝试了以下方法:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/input">
    <ul>
      <xsl:for-each select="//value">
        <li> <xsl:value-of select="."/></li>
      </xsl:for-each>
    </ul> 
  </xsl:template>
</xsl:stylesheet>

但第一个结果(aaa)也包含其子树(bbb,ccc)的值。

2 个答案:

答案 0 :(得分:1)

请尝试使用select="text()"代替select="."来仅选择文字内容。

答案 1 :(得分:1)

在您的情况下成功的关键是模板匹配 应仅复制当前级别

中的文字
<xsl:value-of select="text()"/>

实际上,最好添加 normalize-space()以删除&#34;其他&#34; 白色空间字符:

<xsl:value-of select="normalize-space(text())"/>

打印出与当前级别相对应的内容 li 在元素中,您应该只为子节点添加 apply-templates

<xsl:apply-templates select="*"/>

所以整个脚本可能如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="value">
    <li>
      <xsl:value-of select="normalize-space(text())"/>
    </li>
    <xsl:apply-templates select="*"/>
  </xsl:template>
</xsl:transform>

有关工作示例,请参阅http://xsltransform.net/pNvs5w2