【问题标题】:xsl - Return Multiple Nodes as Comma Separatedxsl - 以逗号分隔返回多个节点
【发布时间】:2016-02-16 12:39:35
【问题描述】:

我正在创建一个 XSL 样式表来将 XML 文件转换为预先格式化的 Excel。其中一列是下面的 CCI_REF。但是,每个 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>

我尝试使用 xsl:for-each,但它现在实际上没有返回任何内容。我猜它是 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>

谢谢。肖恩。

【问题讨论】:

    标签: xml excel xslt foreach


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多