我正在创建一个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>
感谢。肖恩。
答案 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>