我有以下字段(f28),并希望显示所有包含数据的结果。 因为它已经有模板显示值,也没有显示值= null
我的xsl ..对于每个字段
<xsl:template match="f28">
<xsl:choose>
<xsl:when test="ROW/@f1 !='NULL'">
<xsl:element name="hasTestDegree" namespace="{namespace-uri()}#">
<xsl:value-of select='ROW/@f1'/>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:template>
我的XML:
<f28>
<ROW f1='FULL' f2='NULL' f3='NULL' f4='NULL' f5='not certain' f6='BRCA1' f7='NULL'/>
<ROW f1='FULL' f2='NULL' f3='NULL' f4='NULL' f5='no mutation' f6='BRCA2' f7='NULL'/>
<ROW f1='FULL' f2='NULL' f3='NULL' f4='NULL' f5='NULL' f6='p53' f7='NULL'/>
</f28>
我想要以下结果:
<hasTestDegree>FULL</hasTestDegree>
<hasTestResult>not certain</hasTestResult>
<hasTestType>BRCA1</hasTestType>`
<hasTestDegree>FULL</hasTestDegree>
<hasTestResult>no mutation</hasTestResult>
<hasTestType>BRCA2</hasTestType>`
<hasTestDegree>FULL</hasTestDegree>
<hasTestType>p53</hasTestType>`
答案 0 :(得分:1)
这样的事情:
<xsl:template match="f28">
<xsl:apply-templates select="ROW" />
</xsl:template>
<xsl:template match="ROW">
<xsl:apply-templates select="@*">
<xsl:sort select="name()" />
</xsl:apply-templates>
</xsl:template>
<!-- @f1 becomes <hasTestDegree> -->
<xsl:template match="f28//@f1">
<hasTestDegree>
<xsl:value-of select="." />
</hasTestDegree>
</xsl:template>
<!-- add more templates for the other attributes... -->
<!-- any attribute with a value of 'NULL' is not output -->
<xsl:template match="@*[. = 'NULL']" />
注释
<xsl:element>
,只需写出您要创建的元素。@*[. = 'NULL']
的属性,匹配表达式f28//@f1
优先于'NULL'
。<xsl:apply-templates select="ROW" />
)是确保按正确顺序处理所有内容所必需的。<xsl:sort>
中使用<xsl:apply-templates>
或连续多次使用<xsl:apply-templates>
。