代码之家  ›  专栏  ›  技术社区  ›  Tyron78

xslt未按预期运行:未正确考虑属性

  •  0
  • Tyron78  · 技术社区  · 7 年前

    目前我正在重新设计XML文件的导入过程。该结构的特点是节点再次具有一个名为“entrymethod”的属性。当前,在使用 xsl:choose :

    <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”或者属性的值之外,我收到了很多显示除entry方法之外的任何东西的垃圾。似乎是XML中的某一行,但我不知道是哪一行。但它不包括entryMethod属性。

    无论如何,如果按如下方式更改xsl,我将(至少表面上)收到正确的值:

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

    但我不明白为什么!如果我放弃 self::* ?有保证吗 select="@EntryMethod" 总是返回正确的值?我用一些类似于1.5 K的文件测试它,它看起来还行——但是,我将不得不重载数百万文件,我想减少把信息丢失到绝对最小值的风险。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim C    7 年前

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

    如果你这样做了 xsl:value-of 在当前元素上,它将返回该元素的文本值。这意味着将所有子代文本节点连接在一个字符串中。它不会包含任何属性。

    例如,如果 <xsl:value-of select="self:*" /> 在以下XML上(假设您正在匹配 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" />