【发布时间】:2016-06-29 15:04:02
【问题描述】:
我正在尝试使用 XSLT 2.0,但是标签 <xsl:value-of select=...> 不再给我第一个元素。我得到了 XML 中的所有值。如何将以下 XSLT 转换为与 XSLT 2.0 一起使用?
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Data">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Data/ABC">
<xsl:for-each select=".">
<Data xmlns="example.com">
<GEF>
<id><xsl:value-of select="id"/></id>
<time><xsl:value-of select="time"/></time>
<type>test</type>
</GEF>
</Data>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如果我有这个 XML:
<Data xmlns="example.com">
<ABC>
<id>2</id>
<time>125622</time>
</ABC>
</Data>
如果我使用的是 XSLT 1.0,我会得到这个:
<Data xmlns="example.com">
<GEF>
<id>2</id>
<time>125622</time>
<type>test</type>
</GEF>
</Data>
通常,我会将 2 和 125622 作为 XSLT 中每个标记的单个项目。但是,现在它只获取两个值并输出它们。转换后它甚至不打印标签。我想在 2.0 中使用什么?我的搜索没有找到任何东西。
这是我在 2.0 中得到的:
<Data xmlns="example.com">
2
125622
test
</Data>
【问题讨论】:
-
你想得到什么结果? -- 为什么你有
<xsl:apply-templates mode="DataRsp"/>但在那个模式下没有模板? -
“现在它只获取两个值并输出它们。转换后它甚至不打印标签”听起来好像输入 XML 中的元素位于命名空间中,因此您的模板不适用。
Data元素上是否有任何xmlns="..."或祖先? -
你的第二个模板匹配应该是
match="ABC"。因为您对匹配进行了过度限定,所以只应用了默认的转换规则,即只发出元素的文本。删除Data/,它应该可以工作。 -
抱歉,误删了命名空间。 @michael.hor257k 我确实有一个模板,只是没有粘贴它。我将编辑 OP。
-
您是如何使用 XSLT 1.0 运行 XSLT 的?你有没有机会构建一个不知道命名空间的 DOM 树,而处理器因此忽略了
xmlns="example.com"?