如何用XSL获取XML树中compteFacturation节点的第二个libelle值?
我用C#构建了如下的XML结构:
List<Noeud> compteFacturation = new List<Noeud>(); compteFacturation.Add(new Noeud("libelleCompteDeFacturation", "Compte N° 1")); compteFacturation.Add(new Noeud("nombreLigneTraitees", "10")); compteFacturation.Add(new Noeud("nombreLigneStatutOK", "19")); compteFacturation.Add(new Noeud("nombreLigneStatutKO", "11")); compteFacturations.Add(new Noeud("compteFacturation", compteFacturation)); compteFacturation = new List<Noeud>(); compteFacturation.Add(new Noeud("libelleCompteDeFacturation", "Compte N° 2")); compteFacturation.Add(new Noeud("nombreLigneTraitees", "26")); compteFacturation.Add(new Noeud("nombreLigneStatutOK", "25")); compteFacturation.Add(new Noeud("nombreLigneStatutKO", "24")); compteFacturations.Add(new Noeud("compteFacturation", compteFacturation));
当我用XSLT的<xsl:value-of select="//compteFacturation/@libelleCompteDeFacturation" />时,只能拿到第一个元素的“Compte N° 1”,但我想获取第二个元素的“Compte N° 2”。试了<xsl:value-of select="//compteFacturation/@libelleCompteDeFacturation[position() = 2]" />和<xsl:value-of select="//compteFacturation/@libelleCompteDeFacturation/*[2]" />都没结果,该怎么实现呢?
首先得说你之前写法的核心问题:你用@libelleCompteDeFacturation是在找属性,但从你的C#代码来看,libelleCompteDeFacturation其实是compteFacturation的子元素,不是属性!这就是为啥之前的尝试都没效果。
给你几个可行的写法:
写法一:先定位第二个compteFacturation元素,再取子元素
<xsl:value-of select="//compteFacturation[2]/libelleCompteDeFacturation" />
这里//compteFacturation[2]会选中文档里所有compteFacturation元素中的第二个,然后直接取它下面的libelleCompteDeFacturation子元素的内容,刚好就是你要的“Compte N° 2”。
写法二:先收集所有目标子元素,再取第二个
<xsl:value-of select="//compteFacturation/libelleCompteDeFacturation[2]" />
这种写法是先找出所有compteFacturation下的libelleCompteDeFacturation元素,然后取其中的第二个,效果和上面完全一致。
为啥之前的写法不行?
- 第一个尝试
//compteFacturation/@libelleCompteDeFacturation[position() = 2]:因为你的XML里根本不存在名为libelleCompteDeFacturation的属性,所以这个节点集合是空的,自然取不到任何值。 - 第二个尝试
//compteFacturation/@libelleCompteDeFacturation/*[2]:属性本身不是节点集合,不能用/*[2]去选择子节点,再加上属性本身就不存在,所以肯定无效。
内容的提问来源于stack exchange,提问作者user609511

