0

I have the following 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>

I want to ignore any occurrence of the JIRA-1263 after the first one.

The xpath I am trying is (Which works if the duplicates nodes are following. But if you have duplicates else where(deep down), then it is ignored:

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

3 回答 3

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

于 2013-05-22T12:47:45.820 回答
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) 之前以相同子字符串开头但之前没有相同子字符串的日志条目。

于 2013-05-22T13:43:27.983 回答
1

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

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

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

  • 不开始(其中nnnnmsg是一个数字)或JIRA-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诀窍是称为技术的特殊情况孟川分组

同样,您可以将msg元素分组而不是logentry元素,match="msg"在键定义中使用而normalize-space(.)不是normalize-space(msg).

于 2013-05-22T16:30:26.713 回答