Java 测试表达式中的XSLT2.0析取
我想知道是否有一种方法可以更方便地格式化测试表达式中的连接。目前看起来像这样:Java 测试表达式中的XSLT2.0析取,java,xslt,xpath,xslt-2.0,Java,Xslt,Xpath,Xslt 2.0,我想知道是否有一种方法可以更方便地格式化测试表达式中的连接。目前看起来像这样: <xsl:when test="local-name() = 'p' or local-name() = 'ul' or local-name() = 'sec'" > <xsl:call-template name="whatever" /> </xsl:when> 如果我有大约10个元素要在这里测试,那么要找到我已经添加的元素是非常不合适的 在2.0中有类似的东西
<xsl:when test="local-name() = 'p' or local-name() = 'ul' or local-name() = 'sec'" >
<xsl:call-template name="whatever" />
</xsl:when>
如果我有大约10个元素要在这里测试,那么要找到我已经添加的元素是非常不合适的
在2.0中有类似的东西吗
<xsl:when test="local-name() = 'p'|'ul'|'sec'" >
更新:
这在2.0中如何:
<xsl:when test="local-name() = ('p','ui','sec')" >
<xsl:call-template name="whatever" />
</xsl:when>
完全不要使用
local-name()
,请使用正确的命名空间声明和节点测试
这假设XSLT中有一个xmlns:n=“…”
声明
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
*这是因为index-of()
在找到匹配项时返回一个非零数字,而非零数字在布尔上下文中的计算结果为true
尽管我强烈建议在这种情况下不要这样做,因为它与XSLT的设计原则相矛盾。不要使用
local-name()
,请使用适当的名称空间声明和节点测试
这假设XSLT中有一个xmlns:n=“…”
声明
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
*这是因为index-of()
在找到匹配项时返回一个非零数字,而非零数字在布尔上下文中的计算结果为true
尽管我强烈建议在这种情况下不要这样做,因为这与XSLT的设计原则相矛盾。我同意Tomalak不使用
local-name()
,并且典型的方法是使用self::
轴进行匹配:
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
如果您在没有命名空间的情况下使用HTML,则可以对序列使用以下单例测试:
test="node-name(.)=( QName('','p'), QName('','ul'), QName('','sec') )
在XHTML中,您可以使用以下内容:
<xsl:variable name="ns" select="'http://www.w3.org/1999/xhtml'"/>
<xsl:if test="node-name(.)=( QName($ns,'p'), QName($ns,'ul'), QName($ns,'sec') )"/>
xpath-default-namespace="http://www.w3.org/1999/xhtml"
...
test="self::p or self::ul or self::para"
我想如果您只使用XHTML,您可以使用以下内容:
<xsl:variable name="ns" select="'http://www.w3.org/1999/xhtml'"/>
<xsl:if test="node-name(.)=( QName($ns,'p'), QName($ns,'ul'), QName($ns,'sec') )"/>
xpath-default-namespace="http://www.w3.org/1999/xhtml"
...
test="self::p or self::ul or self::para"
但在我的专业工作中,我只使用了xpath默认名称空间,而我保证我的输入只在一个名称空间中。如果我的输入可以有多个名称空间,我从不使用它。我同意Tomalak不使用
local-name()
,典型的方法是使用self::
轴进行匹配:
<xsl:when test="self::n:p or self::n:ul or self::n:para">
<xsl:call-template name="whatever" />
</xsl:when>
如果您在没有命名空间的情况下使用HTML,则可以对序列使用以下单例测试:
test="node-name(.)=( QName('','p'), QName('','ul'), QName('','sec') )
在XHTML中,您可以使用以下内容:
<xsl:variable name="ns" select="'http://www.w3.org/1999/xhtml'"/>
<xsl:if test="node-name(.)=( QName($ns,'p'), QName($ns,'ul'), QName($ns,'sec') )"/>
xpath-default-namespace="http://www.w3.org/1999/xhtml"
...
test="self::p or self::ul or self::para"
我想如果您只使用XHTML,您可以使用以下内容:
<xsl:variable name="ns" select="'http://www.w3.org/1999/xhtml'"/>
<xsl:if test="node-name(.)=( QName($ns,'p'), QName($ns,'ul'), QName($ns,'sec') )"/>
xpath-default-namespace="http://www.w3.org/1999/xhtml"
...
test="self::p or self::ul or self::para"
但在我的专业工作中,我只使用了xpath默认名称空间,而我保证我的输入只在一个名称空间中。如果我的输入可以有多个名称空间,我就不会使用它。你的回答确实让我看得更清楚了,我承认,但我更感兴趣的是一个简单的字符串析取解决方案,就像我添加的那样。我明白了。好吧,与其更新你的问题,不如把它作为你自己的答案发布。它比的
索引更惯用,我会投票表决,如果你愿意,你甚至可以接受自己的答案。我的评估是,你的解决方案不是命名空间安全的,使用函数库的目的不恰当,并且与XDM数据模型不协调。@G.KenHolman如果OP想要命名空间安全的解决方案,他可以使用我提出的另外两个建议中的一个。使用local-name()。除此之外,是的,index-of()
不是实现此目的的理想候选方案(您发布了该解决方案-我是否应该静默复制它?),但它工作正常。你的观点是什么?我想我的观点是OP要求进行析取比较,我将其解释为singleton comparison sequence
或sequence comparison sequence
。如果我留下的印象是我在批评index-of()
的使用,请原谅。对于非名称空间感知检查,可以使用self::*:p
进行检查,而无需使用exposition函数。而self::*:p
正是表达了“我不在乎名称空间是什么”的语义。我承认这听起来很迂腐,但在课堂上,以声音原理为基础进行教学是很重要的。你的回答确实帮助我看得更清楚了。我承认,但我对一个简单的字符串析取解决方案更感兴趣,就像我添加的那个。我明白了。好吧,与其更新你的问题,不如把它作为你自己的答案发布。它比
的索引更惯用,我会投票表决,如果你愿意,你甚至可以接受自己的答案。我的评估是,你的解决方案不是命名空间安全的,使用函数库的目的不恰当,并且与XDM数据模型不协调。@G.KenHolman如果OP想要命名空间安全的解决方案,他可以使用我提出的另外两个建议中的一个。使用local-name()。除此之外,是的,index-of()
不是实现此目的的理想候选方案(您发布了该解决方案-我是否应该静默复制它?),但它工作正常。你的观点是什么?我想我的观点是OP要求进行析取比较,我将其解释为singleton comparison sequence
或sequence comparison sequence
。如果我留下的印象是我在批评index-of()
的使用,请原谅。对于非名称空间感知检查,可以使用self::*:p
进行检查,而无需使用exposition函数。而self::*:p
正是表达了“我不在乎名称空间是什么”的语义。我承认这听起来很迂腐,但在课堂上,以合理的原则为基础进行教学是很重要的。你的更新似乎包含了我在回答中描述的析取,但这并不安全。Tomalak建议使用self::
轴是正确的方法。我提醒我的学生,name()
和local-n