xsl - 以逗号分隔返回多个节点

时间:2016-02-16 12:39:36

标签: xml excel xslt foreach

我正在创建一个XSL样式表来将XML文件转换为预格式化的Excel。其中一列是下面的CCI_REF。但是,每个Vuln_Num可以有多个CCI_REF编号,如下所示。

where item0_.NAME=? and (item0_.DESC is null or item0_.DESC=?)

我尝试使用xsl:for-each,但实际上它现在没有返回任何内容。我猜它是for-each系列中的参考,但我已经尝试了我能想到的每一个组合,并没有产生任何影响。缩写XSL:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CHECKLIST>
 <STIGS>
  <iSTIG>
   <VULN>
    <STIG_DATA>
     <VULN_ATTRIBUTE>Vuln_Num</VULN_ATTRIBUTE>
     <ATTRIBUTE_DATA>V-1070</ATTRIBUTE_DATA>
    </STIG_DATA>
    <STIG_DATA>
     <VULN_ATTRIBUTE>CCI_REF</VULN_ATTRIBUTE>
     <ATTRIBUTE_DATA>CCI-000192</ATTRIBUTE_DATA>
    </STIG_DATA>
    <STIG_DATA>
     <VULN_ATTRIBUTE>CCI_REF</VULN_ATTRIBUTE>
     <ATTRIBUTE_DATA>CCI-000193</ATTRIBUTE_DATA>
    </STIG_DATA>
    <STIG_DATA>
     <VULN_ATTRIBUTE>CCI_REF</VULN_ATTRIBUTE>
     <ATTRIBUTE_DATA>CCI-000194</ATTRIBUTE_DATA>
    </STIG_DATA>
   </VULN>
  </iSTIG>
 </STIGS>
</CHECKLIST>

感谢。肖恩。

1 个答案:

答案 0 :(得分:0)

你遇到的第一个问题是这条线......

<xsl:for-each select="STIG_DATA/VULN_ATTRIBUTE/CCI_REF">

CCI_REF不是XML中的元素,而只是文本节点,因此您希望处理的方式与下一行的处理方式大致相同

<xsl:for-each select="STIG_DATA/VULN_ATTRIBUTE[text() = 'CCI_REF']">

事实上,您可以将其简化为此

 <xsl:for-each select="STIG_DATA[VULN_ATTRIBUTE = 'CCI_REF']">

这样可以更轻松地获取ATTRIBUTE_DATA值,但这样做:

 <xsl:value-of select="ATTRIBUTE_DATA" />

例如,试试这个XSLT

<Worksheet>
 <Table>
  <xsl:for-each select="STIGS/iSTIG/VULN">
  <xsl:sort select="STIG_DATA[VULN_ATTRIBUTE = 'Rule_Ver']/ATTRIBUTE_DATA" order="ascending" />
  <Row>
   <Cell ss:StyleID="stig_rules"> <!-- VMS Key -->
    <Data ss:Type="String">
    <xsl:value-of select="STIG_DATA[VULN_ATTRIBUTE = 'Vuln_Num']/ATTRIBUTE_DATA" />
    </Data>
   </Cell>
   <Cell ss:StyleID="stig_rules"> <!-- CCI Number -->
    <Data ss:Type="String">
     <xsl:for-each select="STIG_DATA[VULN_ATTRIBUTE = 'CCI_REF']">
      <xsl:value-of select="ATTRIBUTE_DATA" />
     <xsl:if test="position() != last()">, </xsl:if>
     </xsl:for-each>
    </Data>
   </Cell>
  </Row>
 </xsl:for-each>
 </Table>
</Worksheet>