XSLT复制没有命名空间的元素

时间:2014-01-28 04:54:49

标签: xml xslt xslt-1.0

我首先要证明我不是特别擅长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>

2 个答案:

答案 0 :(得分:1)

您可以使用:

<xsl:copy-of select="bla" copy-namespaces="no"></xsl:copy-of>
抱歉...刚刚注意到您正在使用XSLT 1,因此不支持复制命名空间...我的错误

答案 1 :(得分:0)

xmlns=""是必需的,因为您声明了一个默认命名空间(带有xmlns="http://www.bazaarvoice.com/xs/PRR/ProductFeed/5.6"),然后输出不在该命名空间中的节点。要使XML正确表示,它必须取消默认命名空间。

您还没有告诉我们验证失败的方式。如果它失败,因为这些节点应该在指定的命名空间中,它们需要在复制它们之前位于该命名空间中,或者您需要将xsl:copy-of操作替换为通过提取其本地名称并使用它们显式重构它们的操作那个和所需的命名空间作为xsl:element操作的参数。 相关下方列出的项目会告诉您更多相关信息。