Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 测试表达式中的XSLT2.0析取_Java_Xslt_Xpath_Xslt 2.0 - Fatal编程技术网

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