XSLT检查String是否在集

时间:2016-07-01 19:28:59

标签: java xml excel xslt saxon

我正在尝试检查字符串是否包含在集合中。我有一张Excel表格,我将其转换为xml文件;例如:

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

ExcelXML

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

Source.xml:

<Data>
    <Number>5556781234</Number>
    <Number>5556781235</Number>
    <Number>5556781236</Number>
</Data>

如你所见它可以在任何地方停止。源xml文件可能包含RowData.xml中列出的所有数字,或者可能只有1个或更多。所以我的问题是,如何在xslt文件中检查?

我想这样做:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- This is the Excel sheet converted to an XML file -->
<xsl:param name="sheet-uri" select="'RowData.xml'"/>
<xsl:param name="sheet-doc" select="document($sheet-uri)"/>

<xsl:template match="Data">
    <xsl:for-each select="Data/Number">
        <xsl:variable name="continue" select="$sheet-doc//Sheet/Row[Number = current()]/Continue"/>

        <xsl:if test="">
            <!-- Check the Source.xml against the RowData.xml and 
                 see if the set contains any "No"'s in it. -->

            <!-- If it does then don't do the following -->

            <Data2>
                <Number><xsl:value-of select="Number"/></Number>
                <Timestamp>125222</Timestamp>
            </Data2>
        </xsl:if>
    </xsl:for-each>
</xsl:template>

所以基本上,在制作<Data2>元素之前,请检查Source.xml中的数字,看看这些数字中是否有任何数字NoContinueRowData.xml。我不知道如何制作上面的if声明。我知道contains()中有一个xslt函数;但是,我不知道如何在这里使用它。

这可能吗?如果有什么令人困惑的话请告诉我。提前谢谢!

2 个答案:

答案 0 :(得分:1)

  

检查Source.xml中的数字,看看RowData.xml中的“继续”列中是否有任何值为No。

你可以利用XSLT&#34;存在的平等&#34;算子在这里:

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

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

答案 1 :(得分:1)

我建议您使用 key 机制 - 尤其是。如果你正在使用XSLT 2.0。

将密钥定义为:

aA

然后做:

a

这会仅选择<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> 的{​​{1}}元素。