Xpath搜索重复

时间:2013-05-22 10:49:09

标签: xslt xpath

我有以下xml:

<log>
    <logentry revision="11956">
        <author>avijendran</author>
        <date>2013-05-20T10:25:19.678089Z</date>
        <msg>
            JIRA-1263 - did something
        </msg>
    </logentry>

    <logentry revision="11956">
        <author>avijendran</author>
        <date>2013-05-20T10:25:19.678089Z</date>
        <msg>
            JIRA-1263 - did something 22 again
        </msg>
    </logentry>
</log>

我想在第一次出现之后忽略任何JIRA-1263的出现。

我正在尝试的xpath(如果重复节点正在跟随,那么它可以工作。但是如果你有重复的地方(内心深处),那么它将被忽略:

<xsl:variable name="uniqueList" select="//msg[not(normalize-space(substring-before(., '&#10;')) = normalize-space(substring-before(following::msg, '&#10;')))]" />

3 个答案:

答案 0 :(得分:2)

如果您希望每个msg使用//msg[starts-with(normalize-space(.), 'JIRA-1263')]来获取输出JIRA-1263 - did somethingJIRA-1263 - did something 22 again

如果您想获得具有相同编码的任何元素,请使用//*[starts-with(normalize-space(.), 'JIRA-1263')],其结果与前一个相同。

最后,如果您希望获得具有相同条件的第一个msg,请使用//logentry/msg[starts-with(normalize-space(.), 'JIRA-1263')][not(preceding::msg)]来获取输出JIRA-1263 - did something

答案 1 :(得分:1)

这里是对你尝试做什么的另一种解释。
找到任何以JIRA-XXXX开头的第一代 如果这是正确的尝试:

  log/logentry[
      starts-with(normalize-space(msg), 'JIRA-') and
      not
      (
        substring-before( normalize-space(msg), ' ')= substring-before( normalize-space(preceding::msg), ' ')
      )]

这将找到任何以JIRA-开头,但在示例中第一个空格(JIRA-XXXX)前面没有前一个子字符串的logentry。

答案 2 :(得分:1)

您可以在样式表的顶层定义,按照第一个词对日志条目进行分组:

<xsl:key name="logentryByCode" match="logentry"
    use="substring-before(normalize-space(msg), ' ')" />

现在您需要选择所有logentry个元素

  • msg 启动JIRA-nnnn(其中nnnn是数字)或
  • 此条目 msg以此单词开头的第一个条目(即每个票号的第一次出现"JIRA-1234 - anything"

(请注意,这两个条件不必相互排斥):

<xsl:variable name="uniqueList" select="log/logentry[
    (
     not(
      starts-with(normalize-space(msg), 'JIRA-') and
      boolean(number(substring-before(substring(normalize-space(msg), 6), ' ')))
     )
    )
  or
    (
     generate-id() = generate-id(key('logentryByCode',
           substring-before(normalize-space(msg), ' '))[1])
    )
 ]/msg" />

boolean(number(...))部分检查是否可以将一串文本解析为有效的非零数字(在这种情况下,文本是JIRA-后面的消息的第一个单词的一部分) ,generate-id技巧是一种称为 Muenchian分组的技术的特例。

同样,您可以使用密钥定义中的msglogentry代替match="msg"来对normalize-space(.)元素而不是normalize-space(msg)元素进行分组。< / p>