我有一个类似于此的简单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定义,我可以将其删除吗?
答案 0 :(得分:1)
虽然它确实违背了问题,我强烈反对它,如果您需要生成这种格式错误的XML,那么您可以使用像...这样的指令。
<xsl:value-of disable-output-escaping="yes" select="
concat('<abc:href var="',$href,'">',$link,'</abc:href>')
"/>
...其中$ href和$ link是适当表达式的位置标记。
在回应OP的评论时,可以使用这样的模板......
<xsl:template match="a">
<xsl:value-of disable-output-escaping="yes" select="
concat('<abc:href var="',@href,'">',.,'</abc:href>')
"/>
</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>