使用XSLT1.0提取XSLT标记,而不使用不必要的名称空间

使用XSLT1.0提取XSLT标记,而不使用不必要的名称空间,xslt,xslt-1.0,xml-namespaces,Xslt,Xslt 1.0,Xml Namespaces,不幸的是,我是XLST的新手。我找不到与我的问题相匹配的解决方案。我必须用XSLT1.0转换文件。给定文件: <?xml version="1.0" encoding="UTF-8"?> <A:A xsi:schemaLocation="urn:A A.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:A="u

不幸的是,我是XLST的新手。我找不到与我的问题相匹配的解决方案。我必须用XSLT1.0转换文件。给定文件:

<?xml version="1.0" encoding="UTF-8"?>
<A:A xsi:schemaLocation="urn:A A.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:A="urn:A">
    <A:B>
        <C xmlns="urn:C">
            <D>foo</D>
        </C>
    </A:B>
    <A:B>
        <C xmlns="urn:C">
            <D>bar</D>
        </C>
    </A:B>
</A:A>

福
酒吧
通缉结果:

<?xml version="1.0" encoding="UTF-8"?>
<C xmlns="urn:C">
    <D>foo</D>
</C>
<C xmlns="urn:C">
    <D>bar</D>
</C>

福
酒吧
我一心想得到想要的结果。我的变压器:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:A="urn:A">

  <xsl:output method="xml" version="1.0" encoding="UTF-8"/>

  <xsl:template match="A:B">
    <xsl:element name="{name()}" namespace="{namespace-uri()}">
      <xsl:copy-of select="node()"/>
    </xsl:element>
  </xsl:template>

</xsl:stylesheet>

产生

<?xml version="1.0" encoding="UTF-8"?>
    <A:B xmlns:A="urn:A">
        <C xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:C">
            <D>foo</D>
        </C>
    </A:B>
    <A:B xmlns:A="urn:A">
        <C xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:C">
            <D>bar</D>
        </C>
    </A:B>

福
酒吧
有没有办法摆脱A:B的信封?

现在的代码是什么



这样,只会使用一个模板来处理孙辈及其后代,该模板将除去每个元素所在的名称空间之外的所有名称空间。

您自己的代码将这些
a:B
元素与
匹配并重新创建,那么为什么不复制或重新创建子节点和后代呢
A:B
元素?但是在XSLT1中,剥离一些名称空间总是有点痛苦,因为那里没有
copy namespaces=“no”
。我已经尝试过复制,但是名称空间将保留下来。我在上面的尝试中被卡住了,因为除了我有这个信封之外,这几乎是我想要的结果。在作用域名称空间中复制哪些规则,不复制哪些规则?在结果示例中显示
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“
但它没有被使用?所以除了这个例子,您能解释一下结果中需要哪些名称空间,哪些不需要吗?您是对的:
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance
是不需要的。我编辑了我的问题。效果很好。如何在每个C标记之间添加类似“分割线”的内容(创建的xml不再有效)?你能问一个新问题吗?你原来的问题显示有两个顶级C元素,因此你似乎想要的结果不是一个格式良好的文档。不清楚你是否要求“分割行”“是指具有不同但格式良好的结果文档或更改结果格式的请求。请参阅
<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="/">
      <xsl:apply-templates select="*/*/node()"/>
  </xsl:template>
  
  <xsl:template match="*">
      <xsl:element name="{name()}" namespace="{namespace-uri()}">
          <xsl:apply-templates select="@* | node()"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>