2017-03-17 98 views
0

我有一个XML结构,我需要为节点应用过滤,并且需要选择特定元素的过滤节点。实际的XML的结构看起来像这 -用于选择过滤节点中的特定值的XSLT

<Host> 
    <element1>type0</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price0</elementn> 
    <Menu> 
    <NodeA> 
    <element1>type1</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price1</elementn> 
    <Menu> 
    <NodeB> 
     <element1>type2</element1> 
     <element2>Fruits</element2> 
     .... 
     <elementn>Price2</elementn> 
     <Menu> 
     <NodeC> 
     <element1>type3</element1> 
     <element2>Fruits</element2> 
     .... 
     <elementn>Price3</elementn> 
     <Menu> 
     <NodeD> 
      <Element1>type4</element1> 
      <Element2>Vegetables</Element2> 
      .... 
      <Elementn>Price4</elementn> 
     </NodeD> 
     </Menu>  
     </NodeC> 
     </Menu> 
    </NodeB> 
    </Menu> 
    </NodeA> 
    <NodeE> 
    <element1>type5</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price5</elementn> 
    <Menu> 
    <NodeF> 
     <element1>type6</element1> 
     <element2>Vegetables</element2> 
     .... 
     <elementn>Price6</elementn> 
    </NodeF> 
    </Menu> 
    </NodeE> 
    </Menu> 
</Host> 

现在我已筛选这个XML如下 - 一)如果<element2> ==水果中的所有节点,XML结果是 -

<Host> 
    <element1>type0</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price0</elementn> 
    <NodeA> 
    <element1>type1</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price1</elementn> 
    </NodeA> 
    <NodeB> 
    <element1>type2</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price2</elementn> 
    </NodeB> 
    <NodeC> 
    <element1>type3</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price3</elementn> 
    </NodeC> 
    <NodeE> 
    <element1>type5</element1> 
    <element2>Fruits</element2> 
    .... 
    <elementn>Price5</elementn> 
    </NodeE>  
</Host> 

用于获取上述结果XSLT是 -

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output method="xml" indent="yes" /> 

<xsl:param name="element2" select="'Fruits'" /> 

<xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:apply-templates select="//*[element2=$element2]" mode="copy"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[element2]" mode="copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="*[not(*)]" mode="copy"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@*|node()" mode="copy"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" mode="copy"/> 
    </xsl:copy> 
</xsl:template> 

上述XSLT选择<element2> = Fruits条件应用于的节点中的所有元素。现在,我需要选择每个过滤节点(<Host>, <NodeA>, <NodeB>, <NodeC>, <NodeE>)中的特定元素 - 例如,对于每个节点,我的元素范围从至。现在我只想从筛选节点(<Host>, <NodeA>, <NodeB>, <NodeC>, <NodeE>)中选择。预期的输出格式如下。下面给出的每个节点的两个值来自于每个节点。

<html> 
<head> 
<body> 
<table border="1"> 
    <tr> 
    <td>type0</td> 
    <td>Price0</td> 
    </tr> 
    <td>type1</td> 
    <td>Price1</td> 
    </tr> 
    <tr> 
    <td>type2</td> 
    <td>Price2</td> 
    </tr> 
    <tr> 
    <td>type3</td> 
    <td>Price3</td> 
    </tr> 
    <tr> 
    <td>type5</td> 
    <td>Price5</td> 
    </tr>  
</table> 
</body> 
</head> 
</html> 

任何帮助将是一个很大的优点。

+0

哪里是'Node0'在输出从何而来?它不在输入或XSLT中。此外,_“现在我需要选择每个节点中的特定元素。”_这是什么意思?这似乎是你的问题的关键,它并没有告诉我们任何有用的东西。 – JLRishe

+0

您可以在问题中看到更改 –

+0

您已完全更改输出,但尚未澄清您的问题。请_explain_你想做什么。您也可以通过描述一个例子来解释,例如“我想将X更改为Y并将M更改为N并仅包含U和V”。 – JLRishe

回答

0

看来你想要做的事,如:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:param name="element2" select="'Fruits'" /> 

<xsl:template match="/"> 
    <html> 
     <head/> 
     <body> 
      <table border="1"> 
       <xsl:for-each select="//*[element2=$element2]"> 
        <tr> 
         <td> 
          <xsl:value-of select="element1" /> 
         </td> 
         <td> 
          <xsl:value-of select="elementn" /> 
         </td> 
        </tr> 
       </xsl:for-each> 
      </table> 
     </body> 
    </html> 
</xsl:template> 

</xsl:stylesheet> 

当这适用于以下合式输入(!):

XML

<Host> 
    <element1>type0</element1> 
    <element2>Fruits</element2> 
    <elementn>Price0</elementn> 
    <Menu> 
     <NodeA> 
     <element1>type1</element1> 
     <element2>Fruits</element2> 
     <elementn>Price1</elementn> 
     <Menu> 
      <NodeB> 
       <element1>type2</element1> 
       <element2>Fruits</element2> 
       <elementn>Price2</elementn> 
       <Menu> 
        <NodeC> 
        <element1>type3</element1> 
        <element2>Fruits</element2> 
        <elementn>Price3</elementn> 
        <Menu> 
         <NodeD> 
          <element1>type4</element1> 
          <element2>Vegetables</element2> 
          <elementn>Price4</elementn> 
         </NodeD> 
        </Menu> 
        </NodeC> 
       </Menu> 
      </NodeB> 
     </Menu> 
     </NodeA> 
     <NodeE> 
     <element1>type5</element1> 
     <element2>Fruits</element2> 
     <elementn>Price5</elementn> 
     <Menu> 
      <NodeF> 
       <element1>type6</element1> 
       <element2>Vegetables</element2> 
       <elementn>Price6</elementn> 
      </NodeF> 
     </Menu> 
     </NodeE> 
    </Menu> 
</Host> 

的结果将是:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    </head> 
    <body> 
     <table border="1"> 
     <tr> 
      <td>type0</td> 
      <td>Price0</td> 
     </tr> 
     <tr> 
      <td>type1</td> 
      <td>Price1</td> 
     </tr> 
     <tr> 
      <td>type2</td> 
      <td>Price2</td> 
     </tr> 
     <tr> 
      <td>type3</td> 
      <td>Price3</td> 
     </tr> 
     <tr> 
      <td>type5</td> 
      <td>Price5</td> 
     </tr> 
     </table> 
    </body> 
</html> 

呈现为:

enter image description here

+0

嗨@ michael.hor257k,我试过了给定的XSLT,但我得到一个空白的回应。我想确认一下,您的XSLT是否确保在给定条件应用于节点时不会复制其子节点? –

+0

你可以看到它在这里工作:http://xsltransform.net/bFWR5Fb –

+0

嗨..它工作。 –