我有以下字段(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>`
- 创建匹配属性的模板
- 为属性应用模板
- 。
像这样:
<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'
的属性,匹配表达式@*[. = 'NULL']
将覆盖f28//@f1
。 - 中间步骤(
<xsl:apply-templates select="ROW" />
)是必要的,以确保一切都按照正确的顺序处理。 - 如果您想手动确定输出顺序,您可以在
<xsl:apply-templates>
中使用<xsl:sort>
或连续多次使用<xsl:apply-templates>
。