首先,先谢谢你。其次,这是我的第一篇文章,因此对任何错误或错误道歉。
我是一个带有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>
答案 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”执行相同操作,您将被排序。