xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀
Posted
技术标签:
【中文标题】xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀【英文标题】:NameSpace prefix for xsd:any elements and adding namespace prefix with XSLT 【发布时间】:2012-12-17 21:35:01 【问题描述】:我在使用名称空间时遇到问题。
我得到如下输入。
<?xml version="1.0" encoding="UTF-8"?>
<Org xmlns="http://mysample.org" >
<Dept>
<Person>
<FirstName>Sample </FirstName>
<LastName> Sampel L </LastName>
<Address>
<Street>Sample Street</Street>
<House>45 Block C </House>
<State>Kentucky</State>
<AddExtension>
<ns3:LandMark xmlns:ns3="http://mysample.org" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ns3:POI tag="temp">Sample POI </ns3:POI>
</ns3:LandMark>
</AddExtension>
</Person>
</Dept>
</Org>
我需要将命名空间前缀添加到此 XML 中的所有元素。
我尝试了以下 XSL:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns3="http://mysample.org">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />
<!-- <xsl:template match="*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/>
</xsl:copy> </xsl:template> -->
<xsl:template match="*">
<xsl:element name="ns3:name()" namespace="http://mysample.org">
<xsl:copy-of select="@*"></xsl:copy-of>
<xsl:copy-of select="namespace::*" />
<xsl:apply-templates select="node()" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
但由于输入 XML 中的 AddExtension 数据而出现问题“
注意:“AddExtension”中的数据是基于 xsd:any 标签的 scema。因此,对于不同的输入 XML,它将是不同的数据。
我该如何克服这个问题?
请帮忙。
【问题讨论】:
【参考方案1】:试试这个模板:
<xsl:template match="*">
<xsl:element name="ns3:local-name()" namespace="namespace-uri()">
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="node()" />
</xsl:element>
</xsl:template>
【讨论】:
【参考方案2】:您当前的尝试是在 http://mysample.org
命名空间中写出文档中的每个元素,并带有显式(我的意思是非空)命名空间前缀。我怀疑你真的希望这只发生在已经在该命名空间中的元素上。所以
-
将现有模板从
match="*"
更改为 match="ns3:*"
。
添加一个模板来处理其他命名空间中的元素(使用 match="*"
处理该命名空间中的元素),该模板只是将它们原封不动地复制过来。
【讨论】:
以上是关于xsd:any 元素的命名空间前缀并使用 XSLT 添加命名空间前缀的主要内容,如果未能解决你的问题,请参考以下文章