【问题标题】:Get a node that contains X string获取包含 X 字符串的节点
【发布时间】:2019-05-08 17:46:40
【问题描述】:

我有点卡住试图获取包含特定字符串值的节点。使用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

【问题讨论】:

    标签: xml xslt xslt-1.0 contains


    【解决方案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>
    

    附:更好的解决方案是更改输入格式。


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

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

    防止双方误报。

    【讨论】:

    • 嗨 Michae,我无法更改输入格式...这取决于第三个提供商。但这似乎是一个很好的解决方案。我在尝试。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2020-01-11
    • 1970-01-01
    相关资源
    最近更新 更多