XSLT无法按预期工作

时间:2012-09-26 20:43:37

标签: xslt

我有一个Xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <child>
    <gc>gc1Value</gc>
  </child>
  <child>child2Value</child>
  <child>
    <gc>gc2Value</gc>
    <gc>gc3Value</gc>
    <gc>
      <ggc>ggcValue</ggc>
      <ggc>ggcValue</ggc>
    </gc>
  </child>
</root>

和一个Xslt文件:

<?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="/">
      <root>
      <xsl:for-each select="root/child">
        <xsl:if test=".!=''">
          <value>
            <xsl:value-of select="."/>
          </value>
        </xsl:if>
        <xsl:for-each select="root/child/gc">
          <xsl:if test=".!=''">
            <value>
              <xsl:value-of select="."/>
            </value>
          </xsl:if>
          <xsl:for-each select="root/child/gc/ggc">
            <xsl:if test=".!=''">
              <value>
                <xsl:value-of select="."/>
              </value>
            </xsl:if>
          </xsl:for-each>
        </xsl:for-each>
      </xsl:for-each>
      </root>
    </xsl:template>
</xsl:stylesheet>

我期待看到这样的结果:

<root>
  <value>gc1Value</value>
  <value>child2Value</value>
  <value>gc2Value</value>
  <value>gc3Value</value>
  <value>ggcValue</value>
  <value>ggcValue</value>
</root>

但是我得到了这个结果:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <value>
    gc1Value
  </value>
  <value>child2Value</value>
  <value>
    gc2Value
    gc3Value

      ggcValue
      ggcValue

  </value>
</root>

我认为通过使用.进行选择,这只会选择当前节点的值,但它似乎也是从子节点获取值。我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

问题在于:

    <xsl:if test="gc!=''">
      <value>
        <xsl:value-of select="."/>
      </value>
    </xsl:if>

“”。将获得当前节点及其所有子节点。

使用node :: text()[即。 select =“text()”]如果你只想要文本。另外我建议使用'string-length(node)!= 0'和喜欢而不是'',

答案 1 :(得分:0)

你的问题与输出有关。

     <value>
        <xsl:value-of select="."/>
      </value>

你有换行符+空格+实际值+换行符+空格。

答案 2 :(得分:0)

如果只想将所有文本节点输出为 value 元素,则可以采用更简化的方法,该方法适用于任何XML结构,无论元素名称如何。

以XSLT为例。这依赖于元素的内置模板规则,该规则只处理其子元素

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

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

   <xsl:template match="text()">
      <value>
         <xsl:value-of select="." />
      </value>
   </xsl:template>
</xsl:stylesheet>

这也可以为您提供预期的结果。