删除命名空间并在复制时添加新元素 XML
Remove Namespace and add new elements while copying XML
我有一个简单的 xml 看起来像
<ns0:AAA xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0">
<ns0:id extension="USER_TYPE"/>
<ns0:bb>SOME VALUE</ns0:bb>
<ns0:cc>OTHER VALUE</ns0:cc>
</ns0:AAA>
我正在尝试在顶级元素周围添加一个“包装器”元素 AAA
并从上面的 xml 中删除名称-space 前缀 ns0
].最后在 <ns0:bb>SOME VALUE</ns0:bb>
.
之后添加新元素
我已经尝试为此构建一个 xslt,但不知何故我无法在复制时删除 ns0
前缀,并且我添加的新元素添加了 xmlns=""
。不确定我做错了什么。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://www.example.com">
<xsl:output method="xml" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:if test="urn:id[@extension='USER_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
<xsl:element name="cred">
<xsl:attribute name="user">test123</xsl:attribute>
<xsl:element name="password">
<xsl:attribute name="root">n</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:if>
<xsl:if test="urn:Id[@extension='ASSET_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
xslt 的输出看起来像
<WRAPPER xmlns="http://www.example.com" ITSVersion="XML_1.0">
<ns0:id xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extension="USER_TYPE"/>
<ns0:bb xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SOME VALUE</ns0:bb>
<ns0:cc xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OTHER VALUE</ns0:cc>
<cred xmlns="" user="test123"><password root="n"/></cred>
</WRAPPER>
如您所见,WRAPPER
元素已正确添加,但所有其他元素都有前缀以及 xmlns 属性,我想删除前缀 ns0
和来自这些元素的 xmlns
属性。我添加的新元素 cred
显示为空 xmlns
.
知道我做错了什么吗?
在此先感谢您的帮助?
你所说的“删除命名空间”实际上需要重命名。这意味着您不能使用 identity transform 模板,它保留处理过的节点 原样 .
尝试按照以下方式进行操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<WRAPPER>
<xsl:apply-templates/>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,这将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<WRAPPER>
<id extension="USER_TYPE"/>
<bb>SOME VALUE</bb>
<cc>OTHER VALUE</cc>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
的使用
我有一个简单的 xml 看起来像
<ns0:AAA xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ITSVersion="XML_1.0">
<ns0:id extension="USER_TYPE"/>
<ns0:bb>SOME VALUE</ns0:bb>
<ns0:cc>OTHER VALUE</ns0:cc>
</ns0:AAA>
我正在尝试在顶级元素周围添加一个“包装器”元素 AAA
并从上面的 xml 中删除名称-space 前缀 ns0
].最后在 <ns0:bb>SOME VALUE</ns0:bb>
.
我已经尝试为此构建一个 xslt,但不知何故我无法在复制时删除 ns0
前缀,并且我添加的新元素添加了 xmlns=""
。不确定我做错了什么。
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://www.example.com">
<xsl:output method="xml" omit-xml-declaration="yes" />
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:if test="urn:id[@extension='USER_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
<xsl:element name="cred">
<xsl:attribute name="user">test123</xsl:attribute>
<xsl:element name="password">
<xsl:attribute name="root">n</xsl:attribute>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:if>
<xsl:if test="urn:Id[@extension='ASSET_TYPE']">
<xsl:element name="WRAPPER" namespace="{namespace-uri()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
xslt 的输出看起来像
<WRAPPER xmlns="http://www.example.com" ITSVersion="XML_1.0">
<ns0:id xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" extension="USER_TYPE"/>
<ns0:bb xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">SOME VALUE</ns0:bb>
<ns0:cc xmlns:ns0="http://www.example.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">OTHER VALUE</ns0:cc>
<cred xmlns="" user="test123"><password root="n"/></cred>
</WRAPPER>
如您所见,WRAPPER
元素已正确添加,但所有其他元素都有前缀以及 xmlns 属性,我想删除前缀 ns0
和来自这些元素的 xmlns
属性。我添加的新元素 cred
显示为空 xmlns
.
知道我做错了什么吗?
在此先感谢您的帮助?
你所说的“删除命名空间”实际上需要重命名。这意味着您不能使用 identity transform 模板,它保留处理过的节点 原样 .
尝试按照以下方式进行操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:copy-of select="@*"/>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match="/*">
<WRAPPER>
<xsl:apply-templates/>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
</xsl:template>
</xsl:stylesheet>
应用于您的示例输入,这将产生:
结果
<?xml version="1.0" encoding="UTF-8"?>
<WRAPPER>
<id extension="USER_TYPE"/>
<bb>SOME VALUE</bb>
<cc>OTHER VALUE</cc>
<cred user="test123">
<password root="n"/>
</cred>
</WRAPPER>
的使用