两个不同变换中的相同XSL给出不同的结果

时间:2015-01-26 12:14:03

标签: xml xslt

对于这个XML:

<TopLevel>
    <NextLevel Label="(123,456,789)"/>
</TopLevel>

我使用以下XSL块将这三个段解析为三个变量(并将整个标签保留用于其他目的):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:output method="text"/>
<xsl:template match="//TopLevel">
<xsl:variable name="LabelAll" select="NextLevel/@Label"/>
<xsl:variable name="Label1" select="substring-before(substring-after($LabelAll,'('),',')"/>
<xsl:variable name="Label2" select="substring-before(substring-after(substring-after($LabelAll,'('),','),',')"/>
<xsl:variable name="Label3" select="substring-before(substring-after(substring-after($LabelAll, ','),','),')')"/>
<xsl:value-of select="$Label1"/><!-- <xsl:text>&#13;&#10;</xsl:text> -->
<xsl:value-of select="$Label2"/><!-- <xsl:text>&#13;&#10;</xsl:text> -->
<xsl:value-of select="$Label3"/><!-- <xsl:text>&#13;&#10;</xsl:text> -->
</xsl:template>
</xsl:stylesheet>

它在两种不同的XSL转换中完美运行。然后我尝试将其添加到另外三个XSL转换中,但在其他转换中,它总是将789分配给LabelAll; Label1Label2Label3为空。

为了排除故障,我将XML修改为:

<TopLevel>
    <NextLevel Label="(123,456,789,ABC,XYZ,PDQ)"/>
</TopLevel>

现在,LabelAll变为789,ABC,XYZ,PDQ),几乎就像子串调用以某种方式相互干扰。

另一种可能性:我使用的转换引擎是一种在后台运行并被触发的服务,可以将多个输出应用于单个源XML。引擎是否可能混合来自不同变换的东西?

谢谢!

2 个答案:

答案 0 :(得分:0)

  

另一种可能性:我使用的转换引擎是一种在后台运行并被触发的服务,可以将多个输出应用于单个源XML。引擎是否可能混合来自不同变换的东西?

是的,如果您错误地调用它并且不考虑线程安全性,则可能。例如,如果您正在使用JAXP并同时在多个线程中使用Transformer对象。

答案 1 :(得分:0)

答案是:还有另一个转换正在制作一个具有相关属性修改值的中间XML。我正在处理的转换由服务配置为使用中间结果XML而不是原始XML。 THX!