XSLT不要将XMLNS添加到元素中

时间:2012-08-29 11:47:13

标签: java xml xslt

我有一个类似于此的简单HTML片段:

<a href="123">link</a>

我需要将其转换为

<abc:href var="123">link</abc:href>

我是用XSLT做的,所以我必须在xsl:stylesheet

中添加名称空间
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:abc="http://abc.ru">

它工作得很好,不幸的是,XSLT转换继续向输出添加XMLNS,如下所示:

<abc:href var="123" xmlns:abc="http://abc.ru">link</abc:href>

我不需要xmlns定义,我可以将其删除吗?

4 个答案:

答案 0 :(得分:1)

虽然它确实违背了问题,我强烈反对它,如果您需要生成这种格式错误的XML,那么您可以使用像...这样的指令。

<xsl:value-of disable-output-escaping="yes" select="
  concat('&lt;abc:href var="',$href,'"&gt;',$link,'&lt;/abc:href&gt;')
 "/>

...其中$ href和$ link是适当表达式的位置标记。


更新

在回应OP的评论时,可以使用这样的模板......

<xsl:template match="a">
  <xsl:value-of disable-output-escaping="yes" select="
    concat('&lt;abc:href var="',@href,'"&gt;',.,'&lt;/abc:href&gt;')
   "/>
</xsl:template>

这个丑陋的解决方案应该仅作为最后的手段使用。一个更好的解决方案是使用XSLT生成您的WHOLE文档,而不仅仅是它的无效片段。通过这种方式,您可以很好地形成文档,并且可以充分发挥XSLT的功能和简单性。

答案 1 :(得分:1)

  

它工作得很好,不幸的是XSLT转换不断添加   输出的XMLNS,如下所示:

<abc:href var="123" xmlns:abc="http://abc.ru">link</abc:href> 
     

我不需要xmlns定义,我可以将其删除吗?

想要删除命名空间声明会产生(命名空间)非格式良好的XML文档,因此XSLT处理器添加了命名空间声明 - 根据W3C XSLT的要求规格。

通过将名称空间声明放在公共祖先(例如生成的XML文档的顶部元素)上,可以使这些名称空间声明“消失”

以下是完整示例

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <top xmlns:abc="http://abc.ru">
   <xsl:apply-templates/>
  </top>
 </xsl:template>

 <xsl:template match="a[@href]">
   <xsl:element name="abc:href" namespace="http://abc.ru">
     <xsl:attribute name="var">
       <xsl:apply-templates/>
     </xsl:attribute>
   </xsl:element>
 </xsl:template>
</xsl:stylesheet>

对以下文档应用此转换时

<html>
  <a href="123">link1</a>
  <a href="xxx">link2</a>
  <a href="yyy">link3</a>
  <a href="zzz">link4</a>
</html>

产生了想要的正确结果

<top xmlns:abc="http://abc.ru">
   <abc:href var="link1"/>
   <abc:href var="link2"/>
   <abc:href var="link3"/>
   <abc:href var="link4"/>
</top>

答案 2 :(得分:1)

  

这很难过,但我确实需要一个无效的xml

XSLT旨在防止您生成错误的XML。如果要生成错误的XML,请不要使用XSLT。

答案 3 :(得分:-1)

尝试使用exclude-result-prefixes,如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:abc="http://abc.ru"
                exclude-result-prefixes="abc">

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

    <xsl:template match="a">
     <href var="{@href}"><xsl:value-of select="."/></href>
    </xsl:template>

</xsl:stylesheet>