0

我需要一点 XSLT 帮助。无法弄清楚为什么实际输出与我的预期输出不同。非常感谢任何帮助!

XML

<?xml version="1.0"?>
<a>
  <b c="d"/>
  <b c="d"/>
  <b c="d"/>
</a>

XSL

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="foo">
        <xsl:param name="content"></xsl:param>
        <xsl:value-of select="$content"></xsl:value-of>
    </xsl:template>

    <xsl:template match="/">
        <xsl:call-template name="foo">
            <xsl:with-param name="content">
                <xsl:for-each select="a/b">
                    <e>
                        <xsl:value-of select="@c" />
                    </e>
                </xsl:for-each>
            </xsl:with-param>
        </xsl:call-template>
    </xsl:template>

实际输出

<?xml version="1.0"?>
ddd

期望的输出

<?xml version="1.0"?>
<e>d</e>
<e>d</e>
<e>d</e>

注意:调用模板是强制性的。在我的情况下,模板在扩展功能方面做得更多。

4

2 回答 2

1

与 ABach 所说的相反,你xsl:param的很好。你唯一需要改变的是你的xsl:value-of. 它应该是xsl:copy-of

<xsl:template name="foo">
    <xsl:param name="content"/>
    <xsl:copy-of select="$content"/>
</xsl:template>
于 2012-10-27T03:59:56.803 回答
0

你很亲近;您刚刚在模板中混淆了相对定位和正确的参数使用。这是一个稍微修改过的答案。

当这个 XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
  <xsl:output omit-xml-declaration="no" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template name="foo">
    <xsl:param name="pContent" />
    <xsl:for-each select="$pContent">
      <e>
        <xsl:value-of select="@c" />
      </e>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="/*">
    <xsl:call-template name="foo">
      <xsl:with-param name="pContent" select="*" />
    </xsl:call-template>
  </xsl:template>

</xsl:stylesheet>

...应用于原始 XML:

<?xml version="1.0"?>
<a>
  <b c="d" />
  <b c="d" />
  <b c="d" />
</a>

...产生了预期的结果:

<?xml version="1.0"?>
<e>d</e>
<e>d</e>
<e>d</e>

特别是,请注意根据<xsl:param>节点的相对位置包含节点的正确用法。在您的情况下,您告诉 XSLT 解析器输出您正在传递的参数的文本值,而不是按照您想要的方式更改节点的内容。

于 2012-10-27T03:03:49.157 回答