我首先要证明我不是特别擅长XSLT。但我要做的是将3个XML文档复制到一个父文档中。
XSLT运行良好,只是父节点使用xmlns="属性打印,这导致我的验证失败。
所以我的问题是,在不添加xmlns属性的情况下,如何从单独的文档中复制这些元素?
这是输出到目的地的示例——注意,我希望它不要打印xmlns="。
<Feed xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"
name="Officeworks" incremental="false"
extractDate="2014-01-28T14:42:12+11:00">
<Brands xmlns="">
<Brand>
<Name>Panasonic</Name>
<ExternalId>12345</ExternalId>
</Brand>
这是XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:template match="/">
<xsl:variable name="dateNow" select="ex:date-time()"/>
<Feed xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6" name='Officeworks' incremental='false'>
<xsl:attribute name="extractDate"><xsl:value-of select="$dateNow" /></xsl:attribute>
<xsl:copy-of select="document('@dataload.bv.xml.out.tmp@/bv_brands_xml.001.xml')/Brands"/>
<xsl:copy-of select="document('@dataload.bv.xml.out.tmp@/bv_categories_xml.001.xml')/Categories"/>
<xsl:copy-of select="document('@dataload.bv.xml.out.tmp@/bv_products_xml.001.xml')/Products"/>
</Feed>
</xsl:template>
</xsl:stylesheet>
您可以使用:
<xsl:copy-of select="bla" copy-namespaces="no"></xsl:copy-of>
对不起。。。刚刚注意到您使用的是XSLT1,因此不支持复制名称空间。。。我糟糕的
xmlns=""
是必需的,因为您正在断言一个默认命名空间(使用xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"
),然后输出不在该命名空间中的节点。为了让XML正确地表示这一点,它必须取消默认的名称空间。
您没有告诉我们验证是如何失败的。如果因为这些节点应该在指定的命名空间中而失败,则在复制它们之前,它们需要在该命名空间中,或者需要将xsl:copy-of
操作替换为通过提取它们的localname并使用该名称空间和所需的命名空间作为xsl:element
操作的参数来显式重建它们的操作。相关下右侧列出的项目将告诉您有关此方面的更多信息。