Java XSLT检查字符串是否在集合中

Java XSLT检查字符串是否在集合中,java,xml,excel,xslt,saxon,Java,Xml,Excel,Xslt,Saxon,我试图检查一个字符串是否包含在一个集合中。我有一张Excel表格,可以转换成xml文件;例如: 左侧为Excel工作表,右侧为转换后的工作表(RowData.xml): 因此,我有一个xml文件,其中这些数字集可能存在,也可能不存在。例如,源xml可能如下所示: Source.xml: <Data> <Number>5556781234</Number> <Number>5556781235</Number>

我试图检查一个字符串是否包含在一个集合中。我有一张Excel表格,可以转换成
xml
文件;例如:

左侧为Excel工作表,右侧为转换后的工作表(
RowData.xml
):

因此,我有一个
xml
文件,其中这些数字集可能存在,也可能不存在。例如,源
xml
可能如下所示:

Source.xml:

<Data>
    <Number>5556781234</Number>
    <Number>5556781235</Number>
    <Number>5556781236</Number>
</Data>
因此,基本上,在创建
元素之前,检查
Source.xml
中的数字,并查看
RowData.xml
中的列
Continue
是否有这些数字的值
No
。我不知道如何做出上面的
if
语句。我知道在
xslt
中有一个
contains()
函数;然而,我不知道如何在这里使用它

这可能吗?如果有什么不明白的地方,请告诉我。提前谢谢

检查Source.xml中的数字,并查看这些数字中是否有任何一个在RowData.xml中Continue列的值为No

您可以在此处利用XSLT的“存在相等”运算符:

test="doc('source.xml')/Data/Number = 
    $sheet-doc//Sheet/Row[Continue='No']/Number"
本质上,如果A和B是一组值,那么如果A中的某个值等于B中的某个值,则A=B返回true

检查Source.xml中的数字,并查看这些数字中是否有任何一个在RowData.xml中Continue列的值为No

您可以在此处利用XSLT的“存在相等”运算符:

test="doc('source.xml')/Data/Number = 
    $sheet-doc//Sheet/Row[Continue='No']/Number"

本质上,如果A和B是一组值,那么如果A中的某个值等于B中的某个值,则A=B返回true。

我建议您使用机制,尤其是在使用XSLT 2.0的情况下

将密钥定义为:

<xsl:key name="row" match="Row" use="Number" />

然后做:

<xsl:template match="/Data">
    <xsl:for-each select="Number[not(key('row', ., $sheet-doc))]">
        <Data2>
            <xsl:copy-of select="."/>
            <Timestamp>125222</Timestamp>
        </Data2>
    </xsl:for-each>
</xsl:template>

125222

这只选择在
RowData.xml
文档中没有相应的
行的
元素。

我建议您使用机制,尤其是在使用XSLT 2.0的情况下

将密钥定义为:

<xsl:key name="row" match="Row" use="Number" />

然后做:

<xsl:template match="/Data">
    <xsl:for-each select="Number[not(key('row', ., $sheet-doc))]">
        <Data2>
            <xsl:copy-of select="."/>
            <Timestamp>125222</Timestamp>
        </Data2>
    </xsl:for-each>
</xsl:template>

125222


这将仅选择
RowData.xml
文档中没有相应
Row
Number
元素。

感谢您的回复,看起来它可以工作了!但是,是否有其他方法来编写
doc('source.xml')/Data/Number
?在Java代码中,我将文件转换为字符串,并使用
Document
类对其进行解析,然后将其作为
DOMSource(Document)
进行转换。例如,一个
这个
函数就很好了。如果唯一的原因是运行XSLT转换,那么您真的不想创建DOM。使用Saxon,转换DOM所需的时间是使用Saxon自己的原生树模型所需时间的5-10倍。尝试切换到s9api接口并使用DocumentBuilder创建树,然后将其作为样式表参数传入。我切换到s9api,但上面的
test
语句不断返回
false
(这与我的旧代码相同)。我通过Java代码和文档的文件路径设置参数。我在语句中唯一更改的是开头部分:
doc($sourcexml)…
。参数名为
$sourcexml
。我做错了什么?对不起,当您使用的是一些不同的代码和对更改内容的描述时,调试代码非常困难。要想知道你做错了什么,我需要知道你到底做了什么。哦,我知道了。这是一个简单的打字错误。谢谢你的帮助!谢谢你的回复,这看起来可以工作了!但是,是否有其他方法来编写
doc('source.xml')/Data/Number
?在Java代码中,我将文件转换为字符串,并使用
Document
类对其进行解析,然后将其作为
DOMSource(Document)
进行转换。例如,一个
这个
函数就很好了。如果唯一的原因是运行XSLT转换,那么您真的不想创建DOM。使用Saxon,转换DOM所需的时间是使用Saxon自己的原生树模型所需时间的5-10倍。尝试切换到s9api接口并使用DocumentBuilder创建树,然后将其作为样式表参数传入。我切换到s9api,但上面的
test
语句不断返回
false
(这与我的旧代码相同)。我通过Java代码和文档的文件路径设置参数。我在语句中唯一更改的是开头部分:
doc($sourcexml)…
。参数名为
$sourcexml
。我做错了什么?对不起,当您使用的是一些不同的代码和对更改内容的描述时,调试代码非常困难。要想知道你做错了什么,我需要知道你到底做了什么。哦,我知道了。这是一个简单的打字错误。谢谢你的帮助!我不太明白你的最后一句话。如果按照
Source.xml
给出的示例,则每个
语句的
将只选择与
RowData.xml
中的数字匹配的
标记。否,它选择所有其他标记。这是因为你的评论说“如果是这样,那么就不要做以下事情”。我的代码是:如果没有,那么做下面的操作。如果我取出
not
,那么我将得到与
Source.xml
中的数字匹配的所有数字?从那里,我可以检查该集合是否有任何Continue等于No?类似这样的:
Number[(key('row',,$sheet doc))]/Continue='No'
?如果只想匹配Continue=No的行,可以将键缩小到:
我想你的版本也应该有用。我不太明白你的最后一句话。如果按照
Source.xml
给出的示例,则每个
语句的
将只选择与数字匹配的
标记