XSLT检查String是否在一个集合内

我想检查一个string是否包含在一个集合。 我有一个Excel表格,我转换成一个xml文件; 例:

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

ExcelXML

所以我有一个xml文件,这些数字可能会或可能不会在那里。 例如,源xml可能如下所示:

Source.xml:

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

如你所见,它可以在任何地方停止。 源xml文件可能具有RowData.xml列出的所有数字,也可能只有一个或多个。 所以我的问题是,如何检查我的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的数字,并查看RowData.xml是否有任何这些数字的值为No的列。 我不知道如何使上面的if语句。 我知道在xslt有一个contains()函数; 但是,我不知道如何在这里使用它。

这可能吗? 请让我知道是否有任何混淆。 提前致谢!

检查Source.xml中的数字,看看RowData.xml中是否有任何这些数字的值为No。

您可以在这里利用XSLT的“存在平等”运算符:

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

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

我build议你使用关键的机制 – 特别是。 如果您使用的是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> 

这只会selectRowData.xml文档中没有相应Row Number元素。