繁体   English   中英

从XSLT 1.0到2.0的转换不会产生标记中的第一个文本

[英]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中的每个标签,我会得到2125622作为单项。 但是,现在它只获取两个值并输出它们。 转换后甚至不打印标签。 我应该在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM