2017-03-17 103 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

嗨..它工作。 –