动态结构和财产价值

时间:2017-08-21 03:23:16

标签: xml xslt xpath

1)如何添加循环以动态确定td之和的总和

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>

输入xml文件

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

outout html file

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

元素和属性的数量是无限的,键的名称可能不同。 我使用group by,如果你有另一个决定,请告诉我。谢谢!!!

1 个答案:

答案 0 :(得分:0)

您可以在此处使用#uvod-ahoj { position: absolute; right: 0; left: 14%; } #uvod-ahoj-div { position: relative; color: white; background-color: #780d4f; } #uvod-ahoj-div > h1 { color: white; margin: 3rem 0; padding: 3rem 0 0 0; } #uvod-ahoj-div > p { margin: auto; max-width: 60rem; padding-bottom: 3rem; } 来获取不同的distinct-values密钥,而不是property

xsl:for-each-group

(假设您位于<xsl:variable name="properties" select="distinct-values(element/property/@key)" /> 元素上)。

然后,对于XML中的每个folder,您可以列出属性的值,如此

element

试试这个XSLT

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

我假设您的实际XML确实声明了<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> 名称空间前缀。我还在XSLT中声明它以使检索xsi属性更简单。

编辑:如果您只能使用XSLT 1.0处理器,则无法使用xsl:type来获取密钥。相反,您需要使用一种名为Muenchian Grouping的技术来获取不同的密钥。 (您也无法使用distinct-values上的separator属性。

请尝试使用此XSLT:

xsl:value-of