xslt用于从所选节点的子集中选择元素

时间:2017-06-07 15:44:12

标签: xml xslt xslt-1.0

我有一个XML,我需要从所有节点中选择特定元素,对于所选元素,我需要从节点子集中选择值。实际XML的结构如下所示 -

<Host> 
  <Node> 
    <element1>type0</element1>
    <element2>Fruits0</element2>
  </Node>
  <Node>
    <element1>type1</element1>
    <element2>Fruits1</element2>
  </Node>
  <Node>
      <element1>type2</element1>
      <element2>
        <Namelist>
          <Names>
            <element2>fruit2</element2>  
            <Node>
              <element1>type3</element1>
              <element2>Fruits3</element2>
            </Node> 
          </Names>
        </Namelist>
      </element2>
  </Node>
  <Node>
    <element1>type4</element1>
    <element2>Fruits4</element2>
  </Node>  
  <Node>
    <element1>type5</element1>
    <element2>Fruits5</element2>
  </Node>
</Host>

现在预期的输出XML如下 -

<html>
<body>
<table border="1"> 
  <tr>
    <td>type0</td>
    <td>Fruits0</td>
  </tr>
  <tr>
    <td>type1</td>
    <td>Fruits1</td>
  </tr>
  <tr>
    <td>type2</td>
    <td>Fruits2</td>
  </tr>
  <tr>
    <td>type3</td>
    <td>Fruits3</td>
  </tr>
  <tr>
    <td>type4</td>
    <td>Fruits4</td>
  </tr>
  <tr>
    <td>type5</td>
    <td>Fruits5</td>
  </tr>
</table> 
</body>  
</html>

编写的XSLT如下 -

<xsl:stylesheet version="1.0"   
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<table border="1">
   <xsl:for-each select="Host">
    <xsl:for-each select="//Node">
    <xsl:sort select="element1" />
    <tr>
        <td><xsl:value-of select="element1" /></td>
        <td><xsl:value-of select="element2" /></td>
    </tr>
    </xsl:for-each>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

输出不符合预期 -

<html>
<body>
<table border="1">
  <tr>
    <td>type0</td>
    <td>Fruits0</td>
  </tr>
  <tr>
    <td>type1</td>
    <td>Fruits1</td>
  </tr>
  <tr>
    <td>type2</td>
    <td>Fruits2Fruits3</td>
  </tr>
  <tr>
    <td>type3</td>
    <td>Fruits3</td>
  </tr>
  <tr>
    <td>type4</td>
    <td>Fruits4</td>
  </tr>
  <tr>
    <td>type5</td>
    <td>Fruits5</td>
  </tr>
</table> 
</body>  
</html>

我想格式化具有数据<element2>Fruits2Fruits3</element2>的元素的输出,该数据不应包含子节点数据。任何帮助将受到高度赞赏。谢谢。

1 个答案:

答案 0 :(得分:0)

尝试更改:

<td><xsl:value-of select="element2"/></td>

为:

<td><xsl:value-of select="(.//element2[text()])[1]"/></td>