Xml 一个模板会破坏另一个模板,即使它不应该';不匹配
我对XSLT还不熟悉,并且对一个模板对我的转换产生的明显影响感到困惑,即使它不应该匹配任何内容 如果我有以下xsl文件:Xml 一个模板会破坏另一个模板,即使它不应该';不匹配,xml,xslt,Xml,Xslt,我对XSLT还不熟悉,并且对一个模板对我的转换产生的明显影响感到困惑,即使它不应该匹配任何内容 如果我有以下xsl文件: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8"
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8"/>
<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="input">
<output>
<xsl:call-template name="flattenText">
<xsl:with-param name="node" select="current()"></xsl:with-param>
</xsl:call-template>
</output>
</xsl:template>
<xsl:template name="flattenText">
<xsl:param name="node"/>
<xsl:for-each select="$node/node()">
<xsl:if test="self::text()">
<xsl:value-of select="string(.)"/>
</xsl:if>
<xsl:if test="self::*">
<xsl:call-template name="flattenText">
<xsl:with-param name="node" select="."/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
</xsl:template>
并在此输入上运行它:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<input>This <span class="blah">text</span> should be flattened.</input>
</root>
此文本应展平。
我得到这个输出,我期望:
<?xml version="1.0" encoding="UTF-8"?>
<output>This text should be flattened.</output>
此文本应展平。
但如果我将此模板添加到XSL文件的底部:
<xsl:template match="span[@class = 'yuk']">
<span>
<xsl:attribute name="class">poo</xsl:attribute>
<xsl:apply-templates />
</span>
</xsl:template>
便便
我明白了:
<?xml version="1.0" encoding="UTF-8"?>
<output>This should be flattened.</output>
这应该是平坦的。
跨度的内容消失了,即使1)我没有在我看到的任何地方应用该模板,2)它甚至不应该与输入中的跨度匹配,因为它有类“blah”,模板应该只与类“yuk”匹配
有人能告诉我发生了什么事,我怎样才能解决它吗?我一定是犯了个愚蠢的错误
我在OxygenXML编辑器16.1中使用JAXP(com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl)转换器,但在Eclipse中也有同样的问题。Saxon 6.5.5可以工作,但我不能在我的项目中使用它
非常感谢您的帮助
更新:
我感谢每个人的帮助和试图重现我的问题。我的同事能够复制它,所以我仍然认为确实出了问题。如果有人感兴趣,以下是我的一些情况:
- Windows 7企业版,64位,Service Pack 1
- java-版本:java版本“1.8.0_31” Java(TM)SE运行时环境(build 1.8.0_31-b13) Java HotSpot(TM)64位服务器虚拟机(构建25.31-b07,混合模式)
- 我在Oxygen中运行JAXP转换时收到此警告: [JAXP]警告:“org.apache.xerces.JAXP.SAXParserImpl:Property”未被识别。”“我不知道这是否重要
我正在开发一个旧的代码库,该代码库被设置为使用JAXP transformer。完成这项工作有一个紧凑而严格的时间表,我认为现在切换到Saxon会带来太多的变化和风险。如果你在做你所说的事情,并且得到你所说的输出,那么它只能是XSLT处理器中的一个bug。正如一些人指出的那样,您得到的结果毫无意义,但是您的
文本模板是非常不必要的。您可以将其替换为:
<xsl:call-template name="flattenText">
<xsl:with-param name="node" select="current()"></xsl:with-param>
</xsl:call-template>
为此:
<!-- Will work the same as flattenText current node is an element -->
<xsl:value-of select="." />
并删除文本
模板。也许这样可以消除您的问题。我无法重现您的问题。添加所述模板不会改变输出。使用、libxslt和Saxon测试。-另外,我相信你的样式表是不必要的复杂-但这与你的问题无关;萨克森9-5-1-2J。怀疑用户错误。检查控制台/日志中的错误,确保您没有看到过时的输出。为什么您只能在项目中使用JAXP?非常感谢。这是最有帮助的答案。我的实际代码情况有点复杂,但我能够采纳您的建议,这似乎避免了这个问题。我没有意识到的值会得到嵌套元素的文本。@tookie_styles是的,元素的值就是这样定义的,并且value of
输出它选择的任何字符串值:“元素节点的字符串值是元素节点的所有文本节点后代的字符串值按文档顺序的串联。”