2011-12-04 2 views
0

여기 내 XML의 일부는 다음과 같습니다 XSL의는 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: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 each cycle에서 xsl은 <row>의 MenuId 속성 값을 <MenuList>으로 읽습니다.
  2. 는 피 각 내부 사이클 내 XSL 내 XSL은 <MenuList><row> 추종 menuId와 속성의 값을 판독하고, 이것에 의해 두 번째 단계 반복 후 <FunctionList>
  3. <row> 년대의 MenuAttribute의 각 값에 그 값을 비교 이 html 메뉴 단추 및 해당 단추 아래에 하위 메뉴 단추를 만들 수있게됩니다.

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

    사람이 어떤 조언을 제공하거나 수정할 수 없습니다 : 메뉴와 하위 메뉴 버튼 사이의 연결은 다음과 같을 것입니다 무슨 난 (XSL로) 할 것을 시도하고 일반 프로그래밍 언어에서 menuId와 속성

인식 내 문제를 해결하기 위해 내 코드? 나는

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

이 짧고 간단하게 변환을 (키를 사용하지 않음) :

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

가 원하는, 올바른 결과을 생산 : 제공된 XML 문서에 적용

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

:

<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> 
관련 문제