重复的follow-sibling节点中第一个出现节点的Xpath

时间:2013-09-22 08:11:51

标签: xpath xslt-1.0

我想根据每个模型描述显示<modelnumber>。我的上下文节点是根级别。

<covergrp>
    <producttype>A</producttype>
    <model_description>abc</model_description>
    <modelnumber>7621</modelnumber>
    <modelnumber>7622</modelnumber>
    <producttype>B</producttype>
    <model_description>XYZ</model_description>
    <modelnumber>7624</modelnumber>
    <modelnumber>7625</modelnumber>
    <producttype>C</producttype>
    <model_description>RBC</model_description>
    <modelnumber>7629</modelnumber>
    <modelnumber>7620</modelnumber>
</covergrp>

1 个答案:

答案 0 :(得分:1)

以下示例使用键引用modelnumber元素后面的model_description元素:

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

<xsl:output method="text"/>    

<xsl:key name="desc" match="modelnumber" use="generate-id(preceding-sibling::model_description[1])"/>

<xsl:template match="covergrp">
  <xsl:apply-templates select="model_description"/>
</xsl:template>

<xsl:template match="model_description">
  <xsl:value-of select="."/>
  <xsl:text>: </xsl:text>
  <xsl:apply-templates select="key('desc', generate-id())"/>
  <xsl:text>&#10;</xsl:text>
</xsl:template>

<xsl:template match="modelnumber">
  <xsl:if test="position() > 1">, </xsl:if>
  <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

对于您的样本输入,输出为

abc: 7621, 7622
XYZ: 7624, 7625
RBC: 7629, 7620

我选择了文本输出,但当然可以使用其他输出方法(例如htmlxml)应用相同的分组方法。