我使用xsl 1.0我想获得每个参数的相应值如下所示。注意下面我的第二个参数的当前结果是第一个重复的值。使用函数只选择不查找value = 'null'
my 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>
my XSL code:
<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>
您可能会得到相同的结果,因为您没有选择f16
上下文中的行。您总是获得第一个元素,因为您实际上选择了所有行的集合。因为上下文是f16
,所以可以使用相对表达式选择后代节点。
要在上下文中选择元素,请在test
和select
中使用相对 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>
...