我是XSLT的新手。我一直在尝试转换XML很长一段时间但无法做到。 输入XML是这样的:
<Load v:MajorVersion="05" v:MinorVersion="01" xmlns="version 2" xmlns:v="version 2">
<annotation/>
<Header></Header>
<Body></Body>
</Load>
如果值为xmlns
,则输出应将属性xmlns:v
和version 2
的值从version 1
替换为version 2
,否则应将其保留为是。
问题是属性很容易发生变化,输入xml可能像xmlns:n
或xmlns:m
,或者这些属性甚至可能不存在。
最后,我们应该搜索节点Load
的所有属性,并在所有属性中搜索字符串version 2
(如xmlns,xmlns:v,xmlns:n等)
并由version 1
替换。
请帮帮我。相信我,我花了好几个小时为此找到答案。
答案 0 :(得分:0)
您的属性是名称空间声明。因此,请查看“如何更改命名空间的URL”。
您可以尝试这样的事情:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:v2="version 2">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="v2:*">
<xsl:element name="{local-name()}" xmlns="version 1">
<xsl:apply-templates select="node()|@*"/>
</xsl:element>
</xsl:template>
<xsl:template match="@v2:*">
<xsl:attribute name="{local-name()}" xmlns="version 1">
<xsl:value-of select="." />
</xsl:attribute>
</xsl:template>
</xsl:stylesheet
答案 1 :(得分:0)
您需要考虑XPath数据模型,而不是源XML。如果您了解XML片段的数据模型,您将会感谢您不想更改xmlns
属性的值,您想要更改元素和属性名称的命名空间部分;也就是说,您希望创建新元素/属性,这些元素/属性的名称具有相同的本地名称,但与旧元素/属性的名称空间URI不同。所以你需要像
<xsl:element name="name()" namespace="...."/>
<xsl:attribute name="v:majorVersion" namespace="...."/>