如何获得第二次相同的元素来自相同的父元素

时间:2016-09-02 10:05:19

标签: xml xslt xsd xslt-1.0

我需要使用xslt在同一个父元素中第二次选择相同的元素。

我正在显示我的xml ..

<parent>
            <a>0001</a>
            <b>05</b>
            <c>20160825</c>
            <d>9463</d>
            <e>anders skov petersen</e>
            <f></f>
            <g></g>
            <h></h>
            <i></i>
            <a>0002</a>
            <b>05</b>
            <c>20160825</c>
            <d>9463</d>
            <e>anders skov petersen</e>
            <f></f>
            <g></g>
            <h></h>
            <i></i>
        </parent>

在我的xml中,a,b,c和所有其他元素都来了两次。所以,如果我必须获取在XSLT中第二次出现的元素值,那么可以告诉我如何做到这一点吗?

2 个答案:

答案 0 :(得分:1)

您可以使用以下XPath-Expression

访问第二个a
/parent/a[2]

这是

的缩写形式
/parent/a[position()=2]

请参阅https://www.w3.org/TR/xpath/

答案 1 :(得分:0)

尝试此选项以识别在同一父级中出现两次的相同元素(名称,而不是内容):

输入XML:

<parent>
   <a>0001</a>
   <b>05</b>
   <c>20160825</c>
   <d>9463</d>
   <e>anders skov petersen</e>
   <f></f>
   <g></g>
   <h></h>
   <i></i>
   <a>0002</a>
   <b>05</b>
   <c>20160825</c>
   <d>9463</d>
   <e>anders skov petersen</e>
   <f></f>
   <g></g>
   <h></h>
   <i></i>
   <j>New element</j>
</parent>

XSLT 1.0:

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

<xsl:key name="kDuplicate" match="*[generate-id(parent::*) = 
                                 generate-id(current()/parent::*)]" use="name()"/>

<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[key('kDuplicate', name())[2]]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="parent">
    <xsl:copy>
      <xsl:for-each select="descendant::*[key('kDuplicate', name())[2]]">
        <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
      </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

结果(元素j没有出现,因为它只在其父级中出现一次)

<parent>
  <a>0001</a>
  <b>05</b>
  <c>20160825</c>
  <d>9463</d>
  <e>anders skov petersen</e>
  <f/>
  <g/>
  <h/>
  <i/>
  <a>0002</a>
  <b>05</b>
  <c>20160825</c>
  <d>9463</d>
  <e>anders skov petersen</e>
  <f/>
  <g/>
  <h/>
  <i/>
</parent>