Xml xsl-以逗号分隔的形式返回多个节点
我正在创建一个XSL样式表,以将XML文件转换为预格式化的Excel。其中一列是下面的CCI_参考。但是,每个Vuln_Num可以有多个CCI_REF编号,如下所示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
<?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>