XSLT - 属性的发生

时间:2012-11-19 16:42:08

标签: xml xslt xpath

我有以下xml:

<Books>   
 <Book author="John" country="Norway"/>   
 <Book author="Paul" />    
 <Book author="Steve" country="England"/>      
</Books>
<Books>       
 <Book author="George" />    
 <Book author="Thomas" country="Germany"/>   
</Books>

我想在每个“Books”元素中找到属性“country”的位置。

<Books>   
 <Book author="John" country="Norway"/>    --1
 <Book author="Paul" />    
 <Book author="Steve" country="England"/> --2
 <Book author="Bob" country="Denmark"/>  --3  
</Books>
<Books>       
 <Book author="George" />    
 <Book author="Thomas" country="Germany"/>  --1 
</Books>

我们可以使用哪种XPath函数?

3 个答案:

答案 0 :(得分:3)

您可以使用该属性计算前一个兄弟姐妹的数量,这是一个显示:

的模板
<xsl:stylesheet 
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="Books/Book[@country]">
  <xsl:value-of select="count(preceding-sibling::Book[@country]) + 1"/> 
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:1)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Books">
     <xsl:apply-templates select=".//@country"/>
 </xsl:template>

 <xsl:template match="@country">
  <xsl:value-of select="position()"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>
</xsl:stylesheet>

将此转换应用于提供的XML文档(格式良好)时:

<t>
<Books>
 <Book author="John" country="Norway"/>    --1
 <Book author="Paul" />
 <Book author="Steve" country="England"/> --2
 <Book author="Bob" country="Denmark"/>  --3
</Books>
<Books>
 <Book author="George" />
 <Book author="Thomas" country="Germany"/>  --1
</Books>
</t>

产生了想要的正确结果

1
2
3
1

答案 2 :(得分:0)

您可以使用XPath计数功能:

count(/Books/Book/@country)