摆脱添加到内部元素<i>,<b>,<mpval> </mpval> </b> </i>的命名空间

时间:2014-01-30 12:14:12

标签: xslt xslt-2.0 xml-namespaces

命名空间被添加到内部元素<i>,<b>, <mpval>。我想摆脱这个命名空间。

我的XML:

 <Container xmlns="http://www.sss.org/schema/"   
  xmlns:meta="http://www.sss.org/schema/tangier/metadata">
 <cs-properties> 
 My Parent level text 1
 <mp>  
 text1 of first child <b> in bold</b>  
 <mpval>36-37</mpval> 
 text2 of child <i> in italic </i> 
 </mp>
 My Parent level text2 in <i>italic</i> also in <b>bold </b>
</cs-properties>
</Container>

当我在XSL下面应用时,我将命名空间添加到<i>元素。想要摆脱它。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:sub="http://www.sss.org/schema"                
exclude-result-prefixes="xsl sub">

<xsl:variable name="ns" select="'http://www.sss.org/schema/'" />

<xsl:output indent="no" omit-xml-declaration="yes"/>

<xsl:variable name="inlineElements" select="'b','i','sub','sup'"/>


<xsl:template match="node()|@*">
<xsl:copy>
  <xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>


 <xsl:template match="sub:cs-properties">
<!--<properties xmlns= "{$ns}">-->
<xsl:element name="cs-properties" namespace="{$ns}" >
  <xsl:for-each-group select="node()" group-adjacent="self::text() or self::node()  
 [name()=$inlineElements]">
    <xsl:choose>
      <xsl:when test="current-grouping-key()=true()">
        <parenttext>
          <xsl:copy-of select="current-group()" copy-namespaces="no" />
        </parenttext>
      </xsl:when>
      <xsl:otherwise>
        <xsl:apply-templates select="."/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
  <!--</properties>-->
  </xsl:element>
 </xsl:template>

 <xsl:template match="sub:mp|sub:abs-max">
 <xsl:element name="{name()}">
  <xsl:for-each-group select="node()" group-adjacent="self::text() or self::node()
 [name()=$inlineElements]">
    <xsl:choose>
      <xsl:when test="current-grouping-key()=true()">
        <childtext>
          <xsl:copy-of select="current-group()" copy-namespaces="no"/>
        </childtext>
      </xsl:when>
      <xsl:otherwise>
        <!--<xsl:apply-templates select="."/>-->
        <xsl:copy-of select="current-group()" copy-namespaces="no"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
 </xsl:element>
 </xsl:template>    
 </xsl:stylesheet>

结果:

<Container xmlns="http://www.sss.org/schema"    
xmlns:meta="http://www.sss.org/schema/tangier/metadata"><cs-properties><parenttext   
xmlns=""> &#xD;
 My Parent level text 1&#xD;
 </parenttext><mp xmlns=""><childtext>  &#xD;
 text1 of first child <b xmlns="http://www.sss.org/schema"> in 
bold</b></childtext><mpval xmlns="http://www.sss.org/schema">36- 
37</mpval><childtext> &#xD;
 text2 of child <i xmlns="http://www.sss.org/schema"> in italic </i>
</childtext></mp><parenttext xmlns="">&#xD;
My Parent level text2 in <i 
xmlns="http://www.sss.org/schema">italic</i> also in <b 
xmlns="http://www.sss.org/schema">bold </b></parenttext></cs-
properties></Container>

1 个答案:

答案 0 :(得分:1)

您可以通过在标记中使用<parenttext xmlns="">或将<parenttext xmlns="http://www.sss.org/schema/">放在样式表的根元素上来避免使用xmlns="http://www.sss.org/schema/"。后者会影响样式表中更多位置可能需要的所有结果元素。