xsl如何显示同一字段的所有属性

时间:2014-05-12 12:54:00

标签: xml xml-parsing xslt-1.0

我有以下字段(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>`

1 个答案:

答案 0 :(得分:1)

  1. 创建与相关属性匹配的模板。
  2. 将模板应用于属性。
  3. 就是这样。
  4. 这样的事情:

    <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>