2015-01-20 153 views
1

是否可以检查字符串数组中是否存在字符串? 我有以下XML:检查字符串数组中是否存在字符串XSL

<?xml version="1.0" encoding="UTF-8"?> 
<ItemsArr> 
    <it attr="DANCHO"> 
    <title>1</title> 
    </it> 
    <it attr="DAN"> 
    <title>2</title> 
    </it> 
    <it attr="IVANCHO"> 
    <title>3</title> 
    </it> 
    <it attr="DRAGANCHO"> 
    <title>4</title> 
    </it> 
    <it attr="PETKANCHO"> 
    <title>5</title> 
    </it> 
    <keys> 
    <itemKey>DANCHO</itemKey> 
    <itemKey>THISISONLYFORTESTING</itemKey> 
    </keys> 
</ItemsArr> 

而下面的XSL转换:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
    <xsl:variable name="items" select="ItemsArr/keys/itemKey"/> 

    <xsl:for-each select="/ItemsArr/it[contains($items,@attr)]"> 
    <tr> 
     <td><xsl:value-of select="@attr"/></td> 
     <td><xsl:value-of select="title"/></td> 
     </tr> 
    </xsl:for-each> 
    </table> 

    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

我想所有的按键(ItemsArr /键)存放在数组($ items),然后迭代它的值,这些值存在于$ items数组中。 请注意,有了上述数据,它们都被选中。 如果两个键被交换(DANCHO和THISISONLYFORTESTING),则不会选择任何内容。

回答

1

contains实际上是一个字符串函数,它检查第一个字符串是否包含第二个字符串。它不是为了在节点集上工作而设计的(在XSLT 1.0中,如果您将它传递给节点集,它将获得该集合中第一个节点的文本值,在XSLT 2.0中会出现错误)。

你可以使用,而不是表达仅仅是这样...

<xsl:for-each select="/ItemsArr/it[@attr = $items/text()]"> 

因此,如果attr属性的任何节点集合中的项目的文本节点匹配的将是真实的。

或者,考虑使用密钥更有效地查找值。

<xsl:key name="items" match="itemKey" use="text()" /> 

那么你会看它这样

<xsl:for-each select="/ItemsArr/it[key('items', @attr)]"> 

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:key name="items" match="itemKey" use="text()" /> 

<xsl:template match="/"> 
    <html> 
    <body> 
    <table border="1"> 
    <xsl:variable name="items" select="ItemsArr/keys/itemKey"/> 

    <xsl:for-each select="/ItemsArr/it[key('items', @attr)]"> 
    <tr> 
     <td><xsl:value-of select="@attr"/></td> 
     <td><xsl:value-of select="title"/></td> 
     </tr> 
    </xsl:for-each> 
    </table> 

    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 
+0

这正是我需要的!愚蠢的我......我是XSL的新手,你们帮了我很多。我会坚持你提供的第一个解决方案。 – 2015-01-21 09:01:28

0

你应该说明你的问题,你没怎么想你想解决它,因为没有阵列数据结构在XSLT 1或2.

如果您的问题是要实现一个数据结构,您可以n查阅这是xsl:key的用途。所以你应该阅读xsl:key和关键函数。

,然后在你的代码键(“阵列”,pathToLookupValue)会告诉你,在你提供的路径值是否在您设置了关键的存在。

相关问题