获取包含X字符串的节点

时间:2019-05-08 17:46:40

标签: xml xslt xslt-1.0 contains

我很想尝试获取包含某些字符串值的节点。使用node[contains(., X)]似乎很容易,但是问题在于,由于以下原因,我得到的公式不是完全指定的节点:

<node>FLT10 FLT3</node>
<node>FLT1 FLT2</node>

要搜索节点,我只有其可能值之一(在这种情况下:FLT1或FLT2或FLT10或FLT3),因此简单的包含将在寻找FLT10,FLT3和FLT2时起作用,但对于FLT1则不起作用,因为在在这种情况下,包含返回包含FLT10的节点,因为(显然)它包含FLT1。我尝试这样做:

[contains(., concat($the_ref, ' '))]

第一步是尝试添加空格,然后它开始对FLT10和FLT1起作用,但不适用于FLT3和FLT2。我的第二个愚蠢步骤是:

[contains(., concat($the_ref, ' ')) or contains(., concat($the_ref, '&lt;'))]

然后...好吧...说我没有得到预期的结果:/

任何想法我该怎么做?

谢谢。

PD:我正在使用xslt 1.0

1 个答案:

答案 0 :(得分:1)

考虑以下示例:

XML

<input>
    <node>FLT10 FLT3</node>
    <node>FLT1 FLT2</node>
    <node>FLT4 FLT1</node>
    <node>FLT5 FLT11</node>
</input>

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/input">
    <result>
        <xsl:copy-of select="node[contains(concat(., ' '), 'FLT1 ')]" />
    </result>
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<result>
  <node>FLT1 FLT2</node>
  <node>FLT4 FLT1</node>
</result>

P.S。更好的解决方案是更改输入格式。


注意:更强大的解决方案可以做到:

[contains(concat(' ', ., ' '), ' FLT1 ')]

防止双方出现误报。