rov*_*nos 5 xml xslt xpath xslt-2.0
我想编写一个匹配属性而不是节点的 XSL 模板,
我认为有这样的东西:
<xsl:template match="@href | @conref | @conrefend">
<xsl:message select="."/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
将匹配这 3 个属性名称中的任何一个,并打印以控制台属性的值,因为范围是属性本身而不是节点。
但我的测试证明我错了,我只能匹配包含任何这些属性的节点,如下所示:
<xsl:template match="*[@href or @conref or @conrefend]">
<xsl:message select="if(not(@href))
then
if(not(@conref))
then @conrefend
else @conref
else @href"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,如果碰巧存在一个具有多个属性的节点,那么只有一个被处理,而我需要处理所有这些属性。
关于为什么第一种方法不起作用的任何想法?
编辑1:完整的xslt:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@conref|@conrefend|@href">
<xsl:message select="."/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
测试 XML:
<links>
<image conref="COPY-GUID/*+-862416}39-37CD-4CF7-A7AA-F09F4A763944" />
</links>
Run Code Online (Sandbox Code Playgroud)
现在 XSLT 不匹配任何内容。
您确实可以像第一个模板一样匹配模板中的属性。一定还有其他问题...
看看身份转换:
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
它可以很好地匹配您正在做的替代方案,并且替代方案之一适用于所有属性 ( @*
)。
现在考虑一下这个xsl:apply-templates
声明。注意如何@*
明确调用。您确定您的模板有机会应用到属性吗?如果您像这样打电话xsl:apply-templates
,例如:
<xsl:apply-templates select="*"/>
Run Code Online (Sandbox Code Playgroud)
意识到只有元素会被选择,而不是属性。另请注意,node()
也不包括属性。
正确的。您的属性匹配模板永远没有机会应用。
添加上面的身份模板,或者类似这样的内容:
<xsl:template match="/">
<xsl:apply-templates select="//@*"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
让您的属性匹配模板有机会应用。
归档时间: |
|
查看次数: |
25572 次 |
最近记录: |