我有以下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(., ' ')) = normalize-space(substring-before(following::msg, ' ')))]" />
答案 0 :(得分:2)
如果您希望每个msg
使用//msg[starts-with(normalize-space(.), 'JIRA-1263')]
来获取输出JIRA-1263 - did something
和JIRA-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分组的技术的特例。
同样,您可以使用密钥定义中的msg
和logentry
代替match="msg"
来对normalize-space(.)
元素而不是normalize-space(msg)
元素进行分组。< / p>