1

我有一个与此类似的简单 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

4 回答 4

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 来生成您的整个文档,而不仅仅是它的无效片段。这样您的文档格式就会很好,并且您可以发挥 XSLT 的全部功能和简单性。

于 2012-08-29T12:20:27.920 回答
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>
于 2012-08-29T12:35:19.943 回答
1

这很可悲,但我真的需要一个无效的 xml

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

于 2012-08-29T14:13:53.563 回答
-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>
于 2012-08-29T12:05:22.750 回答