xsd:任何元素的NameSpace前缀以及使用XSLT添加名称空间前缀

时间:2012-12-17 21:35:02

标签: xml xslt prefix

我在使用名称空间时遇到了麻烦。

我得到如下输入。

  <?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”中的数据基于scema的xsd:any标签。因此,对于不同的输入XML,它将是不同的数据。

我怎样才能克服这个?

请求帮助。

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

您当前的尝试是在http://mysample.org命名空间中写出文档中的每个元素,并使用显式(我的意思是非空)命名空间前缀。我怀疑你真的希望这只发生在那个已经存在于该命名空间中的元素中。所以

  1. 将现有模板从match="*"更改为match="ns3:*"
  2. 添加一个模板来处理其他名称空间中的元素(使用match="*"表示该元素),只复制它们。