Xml xsl-以逗号分隔的形式返回多个节点

Xml xsl-以逗号分隔的形式返回多个节点,xml,excel,xslt,foreach,Xml,Excel,Xslt,Foreach,我正在创建一个XSL样式表,以将XML文件转换为预格式化的Excel。其中一列是下面的CCI_参考。但是,每个Vuln_Num可以有多个CCI_REF编号,如下所示 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <CHECKLIST> <STIGS> <iSTIG> <VULN> <STIG_DATA> <VULN_ATTR

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

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

Vuln_Num
V-1070
CCI_参考
CCI-000192
CCI_参考
CCI-000193
CCI_参考
CCI-000194
我尝试使用xsl:for-each,但实际上现在它没有返回任何内容。我猜这是每一行的参考,但我已经尝试了我能想到的每一种组合,但没有产生任何影响。缩写XSL:

<xsl:call-template name="front_page" />
<Worksheet>
 <xsl:attribute name="ss:Name">
  <xsl:value-of select="$vhostname" />
 </xsl:attribute>
 <Table>
  <xsl:for-each select="STIGS/iSTIG/VULN">
  <xsl:sort select="STIG_DATA/VULN_ATTRIBUTE[node()='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[node()='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="STIG_DATA/VULN_ATTRIBUTE[node()='CCI_REF']/../ATTRIBUTE_DATA" />
     <xsl:if test="position() != last()">, </xsl:if>
     </xsl:for-each>
    </Data>
   </Cell>
  </Row
 </Table>
</Worksheet>

, 

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

<xsl:for-each select="STIG_DATA/VULN_ATTRIBUTE/CCI_REF">
事实上,你可以把它简化成这样

 <xsl:for-each select="STIG_DATA[VULN_ATTRIBUTE = 'CCI_REF']">
例如,试试这个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>

, 
 <xsl:value-of select="ATTRIBUTE_DATA" />
<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>