搜索值而不重复第一个参数的值

时间:2014-05-29 18:22:08

标签: xml xslt xslt-1.0

我正在使用xsl 1.0 我想将每个参数的相应值作为下面的xml。 下面的注释我第二个参数的当前结果是第一个重复的值。 使用该功能只选择不找到value ='null'

我的xml:

<INDIVIDUO param='1' >
  <DATA>
    <f16>
      <ROW f1='Breast' f2='63'/>
     </f16>
</INDIVIDUO>
<INDIVIDUO param='2' >
  <DATA>
    <f16>
      <ROW f1='Beddle' f2='40'/>
    </f16>
</INDIVIDUO>

我的xsl代码:

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

<!--  Begin RDF document  -->
<xsl:template match="/">
<xsl:element name="rdf:RDF">
<rdf:Description rdf:about="http://xxx">
<xsl:apply-templates/>
</rdf:Description>
</xsl:element>
</xsl:template>

    <xsl:template match="f16">
        <xsl:choose>
          <xsl:when test="/INDIVIDUO/DATA/f16/ROW/@f1 !='NULL'">
            <xsl:element name="hasNameCancer" namespace="{namespace-uri()}#">
              <xsl:value-of select="/INDIVIDUO/DATA/f16/ROW/@f1" />
            </xsl:element>
          </xsl:when>
        </xsl:choose>

        <xsl:choose>
          <xsl:when test="/INDIVIDUO/DATA/f16/ROW/@f2 !='NULL'">
            <xsl:element name="idadediag" namespace="{namespace-uri()}#">
              <xsl:value-of select="/INDIVIDUO/DATA/f16/ROW/@f2" />
            </xsl:element>
          </xsl:when>
        </xsl:choose>

我的实际结果:

<individuo_1>
    <hasNameCancer>Breast</hasNameCancer>
    <idadediag>63</idadediag>
  </individuo_1>

  <individuo_2>
    <hasNameCancer>Breast</hasNameCancer>
    <idadediag>63</idadediag>
  </individuo_2>

我希望结果如下:

<individuo_1>
    <hasNameCancer>Breast</hasNameCancer>
    <idadediag>63</idadediag>
  </individuo_1>

  <individuo_2>
    <hasNameCancer>Beddle</hasNameCancer>
    <idadediag>40</idadediag>
  </individuo_2>

1 个答案:

答案 0 :(得分:0)

您可能会得到相同的结果,因为您没有在f16的上下文中选择行。您总是获得第一个元素,因为您实际上是在选择所有行的集合。由于您的上下文为f16,因此您可以使用相对表达式选择后代节点。

要在上下文中选择元素,请在testselect中使用 relative XPath表达式:

<xsl:template match="f16">
    <xsl:choose>
         <xsl:when test="ROW/@f1">
             <xsl:element name="hasNameCancer" namespace="{namespace-uri()}#">
                 <xsl:value-of select="ROW/@f1" />
             </xsl:element>
         </xsl:when>
    </xsl:choose>
    ...