使用XSLT1.0提取XSLT标记,而不使用不必要的名称空间
不幸的是,我是XLST的新手。我找不到与我的问题相匹配的解决方案。我必须用XSLT1.0转换文件。给定文件:使用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
<?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>