2011-03-08 30 views
0

现在,我可以抓住某个元素“root”的直接子元素,并且这些元素的名称中包含破折号。例如,说这些直系子女的名字是“A4-1”,“B3-2”和“C4-3”。XSLT 2.0 - 如何更改比较测试的路径

我想能够做到遵循以下伪代码的东西线:

for each immediate child 
    print out it's child element figtitle/autonum/@ID 

有没有办法做这样的事情,而不级联路径转换成字符串?每次我Concat的直接子值,其路径的其余部分,我得到一个字符串,所以我不能比较它的属性值到另一个值,例如:

<xsl:if test="*['yes' = (PATH)]"> 
    <xsl:value-of select="PATH[@ID = 'yes']"/> 
</xsl:if> 

凡路径将是:

根/ A4-1/figtitle/AUTONUM/@ ID
根/ B3-2/figtitle/AUTONUM/@ ID
根/ C4-3/figtitle/AUTONUM/@ ID

+0

我不明白这个问题。请提供输入样本和所需输出。 – 2011-03-08 17:16:48

+0

您设法混淆了每个人。 '$ element = {'A4-1','A4-2','A4-3'} '对于XSLT或XPath来说都不是合法的语法。请 - 编辑问题并重新制定。 – 2011-03-08 17:16:51

+0

Alejandro&Dimitrie - 编辑了这个问题......希望现在更容易理解。 – Katie 2011-03-08 17:49:09

回答

1

表达你需要的是

/root/*/figtitle/autonum/@ID 

这意味着

选择任何autonum元素是figtitle元素是顶级元素root的孙子的孩子的所有ID属性。

如果元素root不是文档的顶部元件,则如果表达式将用root作为上下文节点的父进行评估,所述表达应该是:

root/*/figtitle/autonum/@ID 

说明

表达:

someElement/* 

选择所有的Elemen ts,它是名为someElement的元素的子元素,该元素是评估表达式所针对的上下文节点(当前节点)的子元素。

因此,没有必要明确列举someElement的子女的名字。

更新:该OP的评论澄清说,她需要只选择root,其名称包含破折号,数字和字母的那些孩子。

此XPath表达式

根/ * [含有(名称(), ' - ') 和 翻译(名称(),$ vAlphaNum,'“)= ''] /figtitle/autonum/@ ID

正好选择所有这些元素。

这里,变量$vAlphaNum必须定义为包含所有大小写字母和数字0-9。

在XSLT 2.0中,可以使用具有适当正则表达式的matches()函数。

+0

@Dimitrie。我不打算选择所有的根,我试图选择所有包含短划线,字母和数字的孩子。有没有办法做到这一点? – Katie 2011-03-09 20:53:54

+0

@凯蒂,当然有。你能否更新你的问题? – 2011-03-09 21:22:14

+0

@Katie:我相应地更新了我的答案。 :) – 2011-03-09 21:29:05