0

我有一个 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>

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

4

3 回答 3

1

问题出在这里:

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

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

使用 node::text() [ 即。select="text()" ] 如果你只想要文本。我也建议使用'string-length(node) != 0'之类的而不是'',

于 2012-09-26T20:52:28.113 回答
0

你的问题在于你的输出。

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

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

于 2012-09-26T20:50:10.193 回答
0

如果打算将所有文本节点简单地输出为元素,则可以采用一种更简化的方法,该方法适用于任何 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>

这也应该给你预期的结果。

于 2012-09-27T09:27:06.790 回答