XSLT 2.0标题泄漏到转换后的XML中

时间:2012-03-30 17:26:26

标签: xml xslt transform xslt-2.0

首先,先谢谢你。其次,这是我的第一篇文章,因此对任何错误或错误道歉。

我是一个带有xml和xslt的菜鸟,似乎无法解决这个问题。当我使用xslt 2.0转换某些xml时,xslt中的一些头文件会泄漏到新的xml中。它似乎没有在xslt 1.0中执行(授予xslt有点不同)。这是xml:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xml_content>
<feed_name>feed</feed_name>
<feed_info>
    <entry_1>
        <id>1</id>
        <pub_date>1320814800</pub_date>
    </entry_1>
</feed_info>
</xml_content>

这是xslt:

<xsl:stylesheet version="2.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:output method="xml" indent="yes" />

<xsl:template match="xml_content">  
<Records>
    <xsl:for-each select="feed_info/entry_1">
        <Record>
            <ID><xsl:value-of select="id" /></ID>
            <PublicationDate><xsl:value-of select='xs:dateTime("1970-01-01T00:00:00") + xs:integer(pub_date) * xs:dayTimeDuration("PT1S")'/></PublicationDate>
        </Record>
    </xsl:for-each>
</Records>
</xsl:template>
</xsl:stylesheet>

这是新的xml。请特别注意第一个“记录”元素。

<?xml version="1.0" encoding="UTF-8"?>
<Records xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns="http://www.w3.org/TR/xhtml1/strict">
         <Record>
             <ID>1</ID>
             <PublicationDate>2011-11-09T05:00:00</PublicationDate>
         </Record>
</Records>

3 个答案:

答案 0 :(得分:1)

它没有泄漏,它正在按照你的要求去做。

XSL文件中的每个未加前缀的标记都在http://www.w3.org/TR/xhtml1/strict命名空间中(这就是xmlns="..."绑定的含义)。不要忘记,XSL文件的核心是XML文件,并且像任何其他XML文件一样进行解析。

但是因为你的XSL模板声明那些标签应该放在输出中,你的输出标签也会在同一个命名空间中。同样,这应该不足为奇,因为标签的完全限定名称由命名空间和本地名称组成。

因此,XSLT处理器必须将该命名空间绑定到前缀以生成正确的输出,这就是您在此处看到的内容。 (它被绑定到空前缀或默认命名空间,但它理论上可以是任何其他前缀,输出意味着完全相同。)

解决方案只是从XSL中删除该命名空间绑定,或者将其更改为您希望输出所在的命名空间。

答案 1 :(得分:1)

如果您输入文字结果元素并且xsl:stylesheet定义了一个默认命名空间(例如xmlns="http://www.w3.org/TR/xhtml1/strict"),那么该命名空间适用于那些结果元素,并且XSLT处理器正确地发出该命名空间声明结果文档的根。我确信XSLT 1.0和2.0会发生这种情况。

对于xmlns:xs="http://www.w3.org/2001/XMLSchema",您可以通过在exclude-result-prefixes="xs"元素上添加xsl:stylesheet来摆脱这种情况。

答案 2 :(得分:0)

使用xsl:element: -

为XSL中的元素指定所需的命名空间
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.w3.org/TR/xhtml1/strict">
    <xsl:output method="xml" indent="yes" />

    <xsl:template match="xml_content">
        <xsl:element name="Records" namespace="Something">
            <xsl:for-each select="feed_info/entry_1">
                <Record>
                    <ID><xsl:value-of select="id" /></ID>
                    <PublicationDate><xsl:value-of select='xs:dateTime("1970-01-01T00:00:00") + xs:integer(pub_date) * xs:dayTimeDuration("PT1S")'/></PublicationDate>
                </Record>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

您将获得以下内容: -

<?xml version="1.0" encoding="UTF-8"?>
<Records xmlns="Something">
   <Record xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.w3.org/TR/xhtml1/strict">
      <ID>1</ID>
      <PublicationDate>2011-11-09T05:00:00</PublicationDate>
   </Record>
</Records>

对“记录”,“ID”和“PublicationDate”执行相同操作,您将被排序。