代码之家  ›  专栏  ›  技术社区  ›  Abra-Cadabra

动态结构和财产价值

  •  0
  • Abra-Cadabra  · 技术社区  · 8 年前

    2) @key=‘ip’-还需要进行动态,从构造的t中获取一个值

    <tr>
      <th>Name</th>
      <th>Type</th>
      <th>Text</th>
      <xsl:for-each-group select="//folder/element/property" group-by="@key">
        <th><xsl:value-of select="current-grouping-key()"/></th>
      </xsl:for-each-group>
    </tr>
    <tr>
      <td>
        <xsl:value-of select="@name"/>
      </td>
      <td>
        <xsl:value-of select="@*[name() = 'xsi:type'][1]"/>
      </td>
      <td>
        <xsl:value-of select="documentation"/>
      </td>
      <xsl:for-each select="...">
        <td>
          <xsl:value-of select="string-join(property[@key='ip']/@value, ', ')"/>
        </td>
      </xsl:for-each>
    </tr>
    

    <folder name="Technology &amp; Physical" type="technology">
        <element xsi:type="archimate:Node" name="SMX_U_TEST">
          <documentation>SMX</documentation>
          <property key="ip" value="10.255.2.111"/>
        </element>
        <element xsi:type="archimate:Node" name="CBS3CVR">
          <documentation>DSR3CVR</documentation>
          <property key="ip" value="10.15.114.24"/>
          <property key="port" value="1521"/>
          <property key="hw"/>
        </element>
        <element xsi:type="archimate:Node" name="SMX">
          <property key="ip" value="10.255.2.111"/>
          <property key="port" value="8181"/>
          <property key="port" value="8182"/>
          <property key="port" value="8184"/>
        </element>
        <element xsi:type="archimate:Node" name="Informatica test">
           <documentation>Informatica</documentation>
          <property key="ip" value="10.11.30.89"/>
          <property key="port" value="1521"/>
        </element>
        <element xsi:type="archimate:Node" name="DSR3TEST">
          <documentation>DSR3TEST</documentation>
          <property key="ip" value="10.255.3.133"/>
          <property key="port" value="1521"/>
          <property key="hw"/>
        </element>
    </folder>
    

    输出html文件

    <html xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
       <body>
          <h2>Technology &amp; Physical</h2>
          <table>
             <tr>
                <th>Name</th>
                <th>Type</th>
                <th>Text</th>
                <th>ip</th>
                <th>port</th>
                <th>hw</th>
             </tr>
             <tr>
                <td>CBS3CVR</td>
                <td>archimate:Node</td>
                <td>DSR3CVR</td>
                <td>10.15.114.24</td>
                <td>1521</td>
                <td/>
             </tr>
             <tr>
                <td>DSR3TEST</td>
                <td>archimate:Node</td>
                <td>DSR3TEST</td>
                <td>10.255.3.133</td>
                <td>1521</td>
                <td/>
             </tr>
             <tr>
                <td>Informatica test</td>
                <td>archimate:Node</td>
                <td>Informatica</td>
                <td>10.11.30.89</td>
                <td>1521</td>
                <td/>
             </tr>
             <tr>
                <td>SMX</td>
                <td>archimate:Node</td>
                <td/>
                <td>10.255.2.111</td>
                <td>8181, 8182, 8184</td>
                <td/>
             </tr>
             <tr>
                <td>SMX_U_TEST</td>
                <td>archimate:Node</td>
                <td>SMX</td>
                <td>10.255.2.111</td>
                <td/>
                <td/>
             </tr>
           </table>
        </body>
      </html>
    

    元素和属性的数量是无限的,键的名称可能不同。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Tim C    8 年前

    您可以使用 distinct-values 在这里获得不同的 property 钥匙,而不是 xsl:for-each-group

    <xsl:variable name="properties" select="distinct-values(element/property/@key)" />
    

    folder

    然后,对于每个 element 在XML中,可以按如下方式列出属性的值

    <xsl:variable name="current" select="." />
    <xsl:for-each select="$properties">
    <td>
      <xsl:value-of select="$current/property[@key=current()]/@value" separator=", " />
    </td>
    </xsl:for-each>
    

    试试这个XSLT

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   exclude-result-prefixes="xsi">
        <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    
        <xsl:template match="folder">
            <xsl:variable name="properties" select="distinct-values(element/property/@key)" />
            <table>
                <tr>
                  <th>Name</th>
                  <th>Type</th>
                  <th>Text</th>
                  <xsl:for-each select="$properties">
                    <th><xsl:value-of select="."/></th>
                  </xsl:for-each>
                </tr>
                <xsl:for-each select="element">
                <tr>
                  <td>
                    <xsl:value-of select="@name"/>
                  </td>
                  <td>
                    <xsl:value-of select="@xsi:type"/>
                  </td>
                  <td>
                    <xsl:value-of select="documentation"/>
                  </td>
                  <xsl:variable name="current" select="." />
                  <xsl:for-each select="$properties">
                    <td>
                      <xsl:value-of select="$current/property[@key=current()]/@value" separator=", " />
                    </td>
                  </xsl:for-each>
                </tr>
                </xsl:for-each>
            </table>
        </xsl:template>
    </xsl:stylesheet>
    

    xsi 命名空间前缀。我还在XSLT中声明它以进行检索 xsl:type

    编辑:如果只能使用XSLT 1.0处理器,则无法使用 去拿钥匙。相反,您需要使用一种称为 Muenchian Grouping 获取不同的键。(您也不能使用 separator 属性打开 xsl:value-of ).

    请尝试以下XSLT:

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   exclude-result-prefixes="xsi">
        <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    
        <xsl:key name="properties" match="property" use="@key" />
    
        <xsl:template match="folder">
            <xsl:variable name="properties" select="//property[generate-id() = generate-id(key('properties', @key)[1])]/@key" />
            <table>
                <tr>
                  <th>Name</th>
                  <th>Type</th>
                  <th>Text</th>
                  <xsl:for-each select="$properties">
                    <th><xsl:value-of select="."/></th>
                  </xsl:for-each>
                </tr>
                <xsl:for-each select="element">
                <tr>
                  <td>
                    <xsl:value-of select="@name"/>
                  </td>
                  <td>
                    <xsl:value-of select="@xsi:type"/>
                  </td>
                  <td>
                    <xsl:value-of select="documentation"/>
                  </td>
                  <xsl:variable name="current" select="." />
                  <xsl:for-each select="$properties">
                    <td>
                      <xsl:for-each select="$current/property[@key=current()]/@value">
                        <xsl:if test="position() > 1">,</xsl:if>
                        <xsl:value-of select="." />
                      </xsl:for-each>
                    </td>
                  </xsl:for-each>
                </tr>
                </xsl:for-each>
            </table>
        </xsl:template>
    </xsl:stylesheet>