XSLT表现异常:属性未正确考虑

时间:2018-06-22 13:00:42

标签: xml xslt

当前,我正在重新设计XML文件的导入过程。该结构具有一个节点,该节点又具有一个称为“ EntryMethod”的属性。当前,在使用xsl:choose导入期间,此属性的字符串值已替换为int值:

<xsl:attribute name="EntryMethodKey">
    <xsl:choose>
        <xsl:when test="self::*[@EntryMethod = 'Scanned']">1</xsl:when>
        ....

但是,已经决定保留字符串值而不是int值,以便在它们到达时动态接收新值而不扩展XSL。因此,除了更改目标表的列之外,我还如下更改了XSL:

    <xsl:attribute name="EntryMethodKey">
        <xsl:value-of select="self::*[@EntryMethod]" />
    </xsl:attribute>

但是,除了输入方法之外,我收到了大量的废话,而不是“ Scanned”或属性的值,而是显示了很多废话。似乎是XML的某种形式,但我不知道是哪一种。但是它不包含EntryMethod属性。

无论如何,如果我按如下所示更改XSL,我将(至少在表面上)收到正确的值:

<xsl:attribute name="EntryMethodKey">
    <xsl:value-of select="@EntryMethod" />
</xsl:attribute>

但是我不明白为什么!如果我丢下self::*,是否没有失去正确值的风险?是否可以保证select="@EntryMethod"始终返回正确的值?我用1.5k的文件进行了测试,看起来还不错-但是,我必须重新加载数百万个文件,并且我想将丢失信息的风险降低到最低限度。

1 个答案:

答案 0 :(得分:1)

表达式self::*[@EntryMethod]获取当前元素,但前提是它具有EntryMethod属性。方括号中的表达式是要检查的条件。在这种情况下,实际上并没有选择属性,只是检查它是否存在。

如果对当前元素执行xsl:value-of,它将返回该元素的文本值。这意味着将所有后代文本节点连接到一个字符串中。它不会包含任何属性。

例如,如果您对以下XML执行<xsl:value-of select="self:*" />(假设您匹配current_node元素),则结果为AB

<current_node EntryMethod="scanned">
    <child1>A</child1>
    <child2>B</child2>
</current_node>

现在,您可以这样做...

<xsl:value-of select="self::*[@EntryMethod]/@EntryMethod" />

但这是不必要的。您可以继续使用已有的功能来获取当前元素的属性值。

<xsl:value-of select="@EntryMethod" />