摆脱空名称空间

时间:2016-05-22 19:48:11

标签: xslt

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns="urn:hl7-org:v3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lab="urn:oid:7.6">
    <section>
        <id extension="something" root="testRoot"/>

        <text>
            <paragraph styleCode="somestyle">Soemthing</paragraph>
            <table>
                <thead>
                    <tr>
                        <th styleCode="styled">Style</th>
                        <th>Stuff</th>                      
                    </tr>
                </thead>
            </table>
        </text>

    </section>

</Test>

这是xslt:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:c="urn:hl7-org:v3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exclude-result-prefixes="#all">

    <xsl:template match="*">
        <xsl:element name="{local-name(.)}">
            <xsl:apply-templates select="@* | node()"/>
        </xsl:element>
    </xsl:template>
    <xsl:template match="@*">
        <xsl:attribute name="{local-name(.)}">
            <xsl:value-of select="."/>
        </xsl:attribute>
    </xsl:template>

    <xsl:template match="/">

        <xsl:apply-templates/>
    </xsl:template>

    <xsl:template match = "c:section/ c:text">
        <text>
            <status value="generated"/>
            <div xmlns="http://www.w3.org/1999/xhtml">
                <xsl:apply-templates/>
            </div>
        </text>     
    </xsl:template>     
</xsl:stylesheet>

这是输出:

<?xml version="1.0" encoding="UTF-8"?><Test>
    <section>
        <id extension="something" root="testRoot"/>

        <text><status value="generated"/><div xmlns="http://www.w3.org/1999/xhtml">
            <paragraph xmlns="" styleCode="somestyle">Soemthing</paragraph>
            <table xmlns="">
                <thead>
                    <tr>
                        <th styleCode="styled">Style</th>
                        <th>Stuff</th>                      
                    </tr>
                </thead>
            </table>
        </div></text>

    </section>

</Test>

正如您所料,我不想要任何像段落和表格那样的空名称空间。我想摆脱它们,以便这些元素就像它们没有任何名称空间一样,但div元素应保留名称空间。

编辑:我也想摆脱文本下所有元素的属性(包括它们的值)。所以最终输出看起来像这样:

<?xml version="1.0" encoding="UTF-8"?><Test>
    <section>
        <id extension="something" root="testRoot"/>

        <text>
      <status value="generated"/>

        <div xmlns="http://www.w3.org/1999/xhtml">
            <paragraph>Soemthing</paragraph>
            <table>
                <thead>
                    <tr>
                        <th>Style</th>
                        <th>Stuff</th>                      
                    </tr>
                </thead>
            </table>
        </div>
       </text>

    </section>

</Test>

1 个答案:

答案 0 :(得分:0)

我猜你想做(!):

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:c="urn:hl7-org:v3"
exclude-result-prefixes="c">
<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:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*" mode="xhtml" >
    <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:apply-templates select="@* | node()" mode="xhtml"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*" mode="#all">
    <xsl:attribute name="{local-name(.)}">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="c:section/c:text">
    <text>
        <status value="generated"/>
        <div xmlns="http://www.w3.org/1999/xhtml"> 
            <xsl:apply-templates mode="xhtml"/>
        </div>
    </text>     
</xsl:template>

</xsl:stylesheet>

这会将div的所有后代放入与其祖先相同的xhtml命名空间中 - 从而产生:

<?xml version="1.0" encoding="UTF-8"?>
<Test>
   <section>
      <id extension="something" root="testRoot"/>
      <text>
         <status value="generated"/>
         <div xmlns="http://www.w3.org/1999/xhtml">
            <paragraph styleCode="somestyle">Soemthing</paragraph>
            <table>
               <thead>
                  <tr>
                     <th styleCode="styled">Style</th>
                     <th>Stuff</th>
                  </tr>
               </thead>
            </table>
         </div>
      </text>
   </section>
</Test>

请注意,这不是有效的XHTML标记。

修改

  

我也想摆脱属性(包括他们的   值))用于文本下的所有元素。

那么,不要对他们应用模板:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:c="urn:hl7-org:v3"
exclude-result-prefixes="c">
<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:apply-templates select="@* | node()"/>
    </xsl:element>
</xsl:template>

<xsl:template match="*" mode="xhtml" >
    <xsl:element name="{local-name(.)}" namespace="http://www.w3.org/1999/xhtml">
        <xsl:apply-templates mode="xhtml"/>
    </xsl:element>
</xsl:template>

<xsl:template match="@*">
    <xsl:attribute name="{local-name(.)}">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="c:section/c:text">
    <text>
        <status value="generated"/>
        <div xmlns="http://www.w3.org/1999/xhtml"> 
            <xsl:apply-templates mode="xhtml"/>
        </div>
    </text>     
</xsl:template>

</xsl:stylesheet>