2011-04-13 2 views
3

선행 형제에 문제가 있습니다. 이게 진짜로 효과가 있니? 내가 XML 내가이처럼 내 ASP 에 LsdbCommand에 XSL 이상으로 통과 할 때처럼 보이는 방법을 알고하지 말자XSLT 선행 형제 제한 및 해결 방법

<stored-procedure id="search-algorithm-parent-child"> 
    <xsl:stylesheet version="1.0" xmlns:spbc="urn:lsapps.spbcontext" xmlns:user="http://www.lodestarcorp.com" xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
     <xsl:output omit-xml-declaration="yes"/> 
     <xsl:template match="node()|/|@*"> 
      <query name="CMNUALGPARENTCHILD"> 
       <sql> 
        SELECT 
         parent.UIDALGLIBPARENTDTL as UIDPARENT, 
         parent.PARENTCHANNELID as VMCHANNELNUMBER, 
         parent.UOMCODE as UOM, 
         child.CHILDDCFLOW AS DCFLOW, 
        FROM 
         ##Q.NUALGLIBPARENTDTL parent, 
         ##Q.NUALGLIBCHILDDTL child 
        WHERE 
         child.UIDALGLIBPARENTDTL = parent.UIDALGLIBPARENTDTL 
         AND parent.UIDALGLIBRARY = '<xsl:value-of select="@UIDALGLIBRARY"/>' 
         ORDER BY UIDPARENT 
       </sql> 
      </query> 
     </xsl:template> 
    </xsl:stylesheet> 
</stored-procedure> 

:

XSL 는 다음과 같이 보이는

var xmlTable5 = LsdbCommand("LSDB.search-algorithm-parent-child", PrefixParams1.valueOf()); 

XML 데이터가 다음과 같을 것이라고 가정합니다 (UIDPARENT에 의해 정렬 됨).

<CMNUALGPARENTCHILD> 
    <someNode> 
    <UIDPARENT>21</UIDPARENT> 
    <VMCHANNELNUMBER>123</VMCHANNELNUMBER> 
    <UOM>5<UOM> 
    <DCFLOW>R<DCFLOW> 
    </someNode> 
    <someNode> 
    <UIDPARENT>21</UIDPARENT> 
    <VMCHANNELNUMBER>123</VMCHANNELNUMBER> 
    <UOM>5<UOM> 
    <DCFLOW>R<DCFLOW> 
    </someNode> 
    ... 
</CMNUALGPARENTCHILD> 
0 지금은

, 내 관심사는 UIDPARENT입니다 .. 제가의 확신하는 것은 그 결과가 이제 (순서대로) ..

21 
21 
21 
81 
81 
81 

을 다음 UIDPARENT있을 것입니다, ASP를, 나는이

전화 AlgorithmParentChild.xslt는 단순히

<x:stylesheet version="1.0" 
    xmlns:x="http://www.w3.org/1999/XSL/Transform" 
    xmlns:i="urn:ls-i18n-formatter" 
    xmlns:ms="urn:schemas-microsoft-com:xslt" 
    xmlns:user="http://www.lodestarcorp.com/user" 
    exclude-result-prefixes="x i ms user"> 

<x:param name="Portal">N</x:param> 
<x:param name="Include">ALL</x:param> 
<x:param name="OrderParams"></x:param> 
<x:param name="FromParam"></x:param> 
<x:param name="ROWPERPAGE">25</x:param> 
<x:param name="AllowEdit"></x:param> 

<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 
<x:template match="/"> 
    <table class="FormTable"> 
    <x:for-each select="//CMNUALGPARENTCHILD"> 
     <tr> 
     <td>current <x:value-of select="@UIDPARENT"/></td> 
     <td>previous <x:value-of select="preceding-sibling::node()/@UIDPARENT"/></td> 
     <td>next <x:value-of select="following-sibling::node()/@UIDPARENT"/></td> 
     </tr> 
    </x:for-each> 
    </table> 
</x:template> 

<x:include href="../controls/MultiSortImages.xslt"/> 
<x:include href="../controls/LockedColumns.xslt"/> 
</x:stylesheet> 

기본 테이블이

과 같은
tTable5 = ProcessXsl(xmlTable5, XmlFreeFile("../zAlgorithmLibrary/AlgorithmParentChild.xslt")); 

current 21 previous next 21 
current 21 previous 21 next 21 
current 21 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 21 next 

첫 번째 세 가지 결과에서 올바른 것 같습니다. 그러나 세 번째 반복 이후에 선행 요소가 어떻게 실패 했습니까? 다음을 반환해야합니다.

current 21 previous next 21 
current 21 previous 21 next 21 
current 21 previous 21 next 81 
current 81 previous 21 next 81 
current 81 previous 81 next 81 
current 81 previous 81 next 

다음 형제는 잘 작동합니다. 선행 형제에 대한 알려진 제한 사항이 있습니까? 해결 방법을 제안 할 수 있습니까? 나는 또한 이전-형제에 단순히 [position=1] 또는 [position()] 또는 [1]를 추가 시도

참고 : 노드()/@ UIDPARENT하지만 여전히

내가 ASP에 새로운 오전 양해 해 주시기 바랍니다 .. 같은 결과가 , XSLT는 XSL .. 내가 가지고 만 .. 그것에 대해,

난 그냥 앞 - 형제가 어떻게 작동하는지 .. 구문을 이해하려면 .. 모든 코드 조각이 아니라 전체 코드를 삽입

+0

제공되는 코드는 주장 "결과"를 생성하지 않습니다에 대한 원래의 질문에서 XML에 추가. 제발, 수정하고 작동하지 않는 오도 된 코드를 제공하지 마십시오! 당신은 완전히 downvote 자격이 있습니다. –

+0

또한 숙제를하고 의미없는 코드를 작성하지 말고 이와 같은 질문을 할 수있는 최소량의 XPath를 읽고 배우십시오. 요소와 속성의 차이점을 시작하십시오. –

+0

나는 position()을 추가하려고 시도했다. 여전히 다음 형제와 잘 동작했다. 이전 형제에 대한 동일한 결과. 다음 형제가 두 접근법 모두에서 작동하는 것이 가능하지만 실패는 어떻게되는지 모르겠다. 선행 형제 .. 실제로 asp에서 lsdbcommand()의 결과를 전달하여 processxsl 사용하고 있습니다 .. 그게 정말 어떻게 보이는지 모르겠지만 wondrin '왜 완벽하게 olay와 함께 해요 형제 자매 형제. – nacho

답변

4

W3C specification에 설명 된대로 :

앞 - 형제 축

무슨 말을하지 않는 것은 그것이 역으로 작동되는 컨텍스트 노드의 모든 앞의 형제 자매를 포함하고 있습니다!

<?xml version="1.0" encoding="UTF-8"?> 
<x:stylesheet version="1.0" 
    xmlns:x="http://www.w3.org/1999/XSL/Transform" 
    exclude-result-prefixes="x"> 
<x:output method="html" version="1.0" encoding="UTF-8" indent="yes"/> 
<x:template match="CMNUALGPARENTCHILD"> 
    <table> 
    <x:for-each select="UIDPARENT"> 
     <tr> 
     <td>current <x:value-of select="."/></td> 
     <td>previous <x:value-of select="preceding-sibling::UIDPARENT[position()=1]"/></td> 
     <td>next <x:value-of select="following-sibling::UIDPARENT[position()=1]"/></td> 
     </tr> 
    </x:for-each> 
</table> 
</x:template> 
</x:stylesheet> 

내가 작동하도록 문제의 XSL을 가져올 수 없습니다 :이 같은 선택 당신의 XPath의 마지막에 [position()=1] 술어를 추가해야합니다. 하지만이 XML에 대한 귀하의 질문에 나를 위해 작동합니다.

편집 : 참조

<CMNUALGPARENTCHILD> 
    <UIDPARENT>21</UIDPARENT> 
    <UIDPARENT>21</UIDPARENT> 
    <UIDPARENT>21</UIDPARENT> 
    <UIDPARENT>81</UIDPARENT> 
    <UIDPARENT>81</UIDPARENT> 
    <UIDPARENT>81</UIDPARENT> 
</CMNUALGPARENTCHILD> 
+1

'preceding-sibling :: UIDPARENT [position() = 1]'또는보다 간단하게'preceding-sibling :: UIDPARENT [1] ' –

+0

@lwburk +1 깨끗함입니다. 나는 술어 뒤에있는 의미를 설명하려고 애썼다 :-) – andyb

+0

나는 질문을 편집했다. 확인 ... 답장을 위해 @andyb에게 감사한다. 그러나 그것은 여전히 ​​문제를 해결하지 못한다. 더 설명해주세요. – nacho