[英]Conversion from XSLT 1.0 to 2.0 doesn't give first text from a tag
我正在尝试使用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>
通常,对于XSLT中的每个标签,我会得到2
和125622
作为单项。 但是,现在它只获取两个值并输出它们。 转换后甚至不打印标签。 我应该在2.0中使用什么? 我的搜索没有显示任何内容。
这是我从2.0获得的:
<Data xmlns="example.com">
2
125622
test
</Data>
使代码在XSLT 2.0下工作的一种方法是在向后兼容模式下运行它,只需将版本号保留为version =“ 1.0”即可完成。 如果您知道对XSLT 1.0语义的依赖性仅适用于样式表的特定部分,那么您可以有选择地执行此操作,例如
<xsl:for-each select="." version="1.0">
<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>
如果可以的话,最好将代码转换为以2.0方式工作。 如果只希望xsl:value-of
指令处理节点集中的第一项,则只需添加[1]
以选择第一项,例如
<id><xsl:value-of select="id[1]"/></id>
XSLT和XPath(1.0作为更高版本)可以使用名称空间感知的数据模型,因此,给定<Data xmlns="example.com">
Data
元素及其后代都位于名称空间example.com
,您的XSLT需要将其纳入帐户。 在XSLT 2.0中,您可以使用
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="example.com">
至于Java代码,请确保使用名称空间感知的DocumentBuilderFactory 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.