当前,我正在重新设计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的文件进行了测试,看起来还不错-但是,我必须重新加载数百万个文件,并且我想将丢失信息的风险降低到最低限度。
答案 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" />