2011-12-04 6 views
0

内のノードの2セットを比較する手助けが必要です。ここに私のxmlの作品です:は、XSL

<div id="menu"> 
    <div>menu1 
     <div class="subMenu"> 
      <div>submenu1 
      </div> 
      <div>submenu2 
      </div> 
     </div> 
    </div> 
    <div>menu2 
     <div class="subMenu"> 
     </div> 
    </div> 
    <div>menu3 
     <div class="subMenu"> 
      <div>submenu3 
      </div> 
     </div> 
    </div> 
    <div>menu4 
     <div class="subMenu"> 
     </div> 
    </div> 
</div> 

とXSLの作品:

<xsl:template match="//Authentication/GetUserMenu"> 
     <div> 
      <xsl:for-each select="//MenuList/row"> 
       <div><xsl:value-of select="@MenuID"/></div> 
       tu 
       <xsl:for-each select="//FunctionList/row["> 
        <div><xsl:value-of select="@MenuID"/></div> 
       </xsl:for-each> 
       tu 
      </xsl:for-each> 
     </div> 
    </xsl:template> 

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href="ran.xsl"?> 
    <Authentication isLogged="1" uid="40"> 
     <GetUserMenu> 
      <MenuList> 
       <row MenuID="1" MenuTitle="menu1"/> 
       <row MenuID="2" MenuTitle="menu2"/> 
       <row MenuID="3" MenuTitle="menu3"/> 
       <row MenuID="4" MenuTitle="menu4"/> 
      </MenuList> 

      <FunctionList> 
       <row FunctionID="1" FunctionTitle="submenu1" MenuID="1" WorkflowName="ImportDataWithoutFile" Order="1"/> 
       <row FunctionID="2" FunctionTitle="submenu2" MenuID="1" WorkflowName="ImportDataFromFile" Order="2"/> 
       <row FunctionID="2" FunctionTitle="submenu2" MenuID="3" WorkflowName="ImportDataFromFile" Order="2"/> 
      </FunctionList> 
     </GetUserMenu> 
    </Authentication> 

HTML出力は次のようなものでなければなりません

xslでこれを行うようにします:

  1. 外部のfor-eachサイクルでは、xslは<row>のMenuId属性の値を<MenuList>の値で読み取ります。
  2. はその後のために、各インナーサイクルに私のXSLは私のXSLは<MenuList><row>を次のmenuID属性属性の値を読み取り、これにより第二段階 を繰り返し、その後<FunctionList>
  3. <row>年代のMenuAttributeのすべての値にその値を比較し、これは、私は対応するボタンの下にHTMLメニューボタンとサブメニューボタンを作ることができるでしょう。メニューとサブメニューボタンの間の接続は、menuID属性によって認識され、通常のプログラミング言語では

属性私は(XSLで)やろうとしていますと、次のようになります。

foreach (xitems as xitem) 
    foreach (yitems as yitem) 
     if xitem == yitem do smth 

誰もが何かアドバイスを与えるか、または修正することができます私の問題を解決するために私のコードですか?私は

+0

XML入力をHTML出力に変換するXSLTの方法について助けが必要な場合は、作成したいXML入力とそれに対応するHTML出力の小さいサンプルを表示することを検討してください。それから、適切なXSLTコードを手助けすることができます。 「通常の」プログラミング言語のコードをXSLTコードに「翻訳する」ことは、XSLTの問題を解決するための良いアプローチではありません。 –

+0

私は予想されるHTML出力を投稿しました。それ以上の詳細が不足している場合は、教えてください。私はいくつかの助けに感謝します –

答えて

0

は、私は次のようにあなたがxsl:keykey機能を使用したいと思う感謝される:そのコードとあなたがサクソン投稿を入力して

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

    <xsl:output method="html" indent="yes"/> 

    <xsl:key name="k1" match="FunctionList/row" use="@MenuID"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="Authentication/GetUserMenu"/> 
    </xsl:template> 

    <xsl:template match="Authentication/GetUserMenu"> 
    <div> 
     <xsl:apply-templates select="MenuList/row"/> 
    </div> 
    </xsl:template> 

    <xsl:template match="MenuList/row"> 
    <div> 
     <xsl:value-of select="@MenuTitle"/> 
     <div class="subMenu"> 
     <xsl:apply-templates select="key('k1', @MenuID)"/> 
     </div> 
    </div> 
    </xsl:template> 

    <xsl:template match="FunctionList/row"> 
    <div> 
     <xsl:value-of select="@FunctionTitle"/> 
    </div> 
    </xsl:template> 

</xsl:stylesheet> 

を6.5.5出力

<div> 
    <div>menu1 
     <div class="subMenu"> 
     <div>submenu1</div> 
     <div>submenu2</div> 
     </div> 
    </div> 
    <div>menu2 
     <div class="subMenu"></div> 
    </div> 
    <div>menu3 
     <div class="subMenu"> 
     <div>submenu2</div> 
     </div> 
    </div> 
    <div>menu4 
     <div class="subMenu"></div> 
    </div> 
</div> 

それはあなたが望む結果として投稿したものではありませんが、submenu3がどこから来るのかわからないのは、そのような項目がXML入力にないからです。

0

良い質問、+1。

これより短く、シンプルな(キーを使用していない)変換

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <div id="menu"> 
    <xsl:apply-templates/> 
    </div> 
</xsl:template> 

<xsl:template match="MenuList/row"> 
    <div> 
    <xsl:value-of select="@MenuTitle"/> 
    <div class="subMenu"> 
    <xsl:apply-templates mode="extract" select= 
    "../../FunctionList 
       /row[@MenuID = current()/@MenuID] 
    "/> 
    </div> 
    </div> 
</xsl:template> 

<xsl:template match="FunctionList/row" mode="extract"> 
    <div><xsl:value-of select="@FunctionTitle"/></div> 
</xsl:template> 
</xsl:stylesheet> 

提供されるXML文書に適用:

<Authentication isLogged="1" uid="40"> 
    <GetUserMenu> 
     <MenuList> 
      <row MenuID="1" MenuTitle="menu1"/> 
      <row MenuID="2" MenuTitle="menu2"/> 
      <row MenuID="3" MenuTitle="menu3"/> 
      <row MenuID="4" MenuTitle="menu4"/> 
     </MenuList> 
     <FunctionList> 
      <row FunctionID="1" FunctionTitle="submenu1" MenuID="1" 
       WorkflowName="ImportDataWithoutFile" Order="1"/> 
      <row FunctionID="2" FunctionTitle="submenu2" MenuID="1" 
       WorkflowName="ImportDataFromFile" Order="2"/> 
      <row FunctionID="2" FunctionTitle="submenu3" MenuID="3" 
       WorkflowName="ImportDataFromFile" Order="2"/> 
     </FunctionList> 
    </GetUserMenu> 
</Authentication> 

は指名手配、正しい結果を生成します。

<div id="menu"> 
    <div>menu1<div class="subMenu"> 
     <div>submenu1</div> 
     <div>submenu2</div> 
     </div> 
    </div> 
    <div>menu2<div class="subMenu"/> 
    </div> 
    <div>menu3<div class="subMenu"> 
     <div>submenu3</div> 
     </div> 
    </div> 
    <div>menu4<div class="subMenu"/> 
    </div> 
</div>