2012-11-26 3 views
0

에 따라이 문제는 쿼리에서 내가 값을 가질 수있는 매개 변수 '보행'을받을 수정 한 XSLT: Sorting based on sum of values from other nodesXSLT : 경로의 대체 일부 매개 변수

내가 XSLT의이 작품이 (데 미터 덕분에)에 다음과 'P'(페이스), 'T'(트로트) 또는 'A'(모든)

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:key name="kOffspring" match="Horse" use="SireID"/> 
<xsl:param name="Gait"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates select="Sires/Sire"> 
    <xsl:sort select="sum(key('kOffspring', ID)/*/Stakes)" 
      data-type="number" order="descending"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="Sire"> 
    Sire <xsl:value-of select="concat(ID,' (', Name, ') Stakes: ')"/> 
    <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

위의 코드에서 별표로 대체하는 방법이 있는가이 조각

sum(key('kOffspring', ID)/*/Stakes 

인 부분과 걸음 걸이에 전달 된 값에 따라 xml 트리의 노드 이름?

슈퍼 단순화 된 XML은 다음과 같습니다

<t> 
    <Horses> 
     <Horse> 
      <ID>5</ID> 
      <Name>hrsE</Name> 
      <SireID>101</SireID> 
      <Pace> 
       <Stakes>100</Stakes> 
      </Pace> 
      <Trot> 
       <Stakes>300</Stakes> 
      </Trot> 
     </Horse> 
    </Horses> 
    <Sires> 
     <Sire> 
      <ID>101</ID> 
      <Name>srA</Name> 
      <LiveFoalsALL>117</LiveFoalsALL> 
     </Sire> 
    </Sires> 
</t> 

$ 보행이 경우 'A'내가 원하는 합 (키 ('kOffspring'ID)/*/스테이크가 (말의 모든 하위 노드 보면)

$ 보행이 'P'내가 합 원하는 (키 ('kOffspring'ID)/페이스/스테이크가 (단 말뚝을 찾기 위해 페이스 노드에서 보면) 인

$ 보행은 ' T '내가 원하는 합계 (키 ('k 자손 ', ID)/트로트/스테이크 (트로트 노드에서만 스테이크를 찾으십시오)

이렇게 매우 단순화 된 예입니다. 나는 $ Gait의 다른 값을 맞추기 위해 100 줄의 코드를 복사하는 것을 멈추려 고하고있다. 사용 변수를 시도해 보았지만 경로의 키를 사용할 때 노드 경로의 값을 변경하는 방법을 볼 수 없었습니다. 나는 잠재적으로 'match = "/ *"'템플릿에서 choose 문을 사용할 수 있음을 보았습니다. 그러나 그것은 정렬만을위한 것이 었습니다. 나는 'Sire'템플릿에 도달했을 때 여전히 붙어있었습니다. 내가 가지고있는 모든 '가치 - 선택 (value-of select)'진술을 골라라.

의견을 보내 주셔서 감사합니다. 감사합니다, 브라이스 Stenberg.

답변

2

그냥 답장을 보내, 감사

sum(key('kOffspring', ID)/*[name()=$Gait]/Stakes 
+0

안녕 마이클, 잘 찾고 있습니다. 페이스와 트로트 노드 모두에서 일치 시키려고 할 때 $ Gait을 설정하는 것이 어떤 가치인지 모르겠다. 나는 빈 문자열을 시도하고 '*'값으로하지만 그 작동하지 않았다. 나는 Pacers와 Trotters와 같은 두 개의 매개 변수를 최상위 레벨에서 적절하게 (값 또는 널) 설정하고'sum (key ('kOspspring', ID)/* [name() = $ Pacers and name() = $ Bryce. – user1840734

+0

woo - 그 안에 '또는'가 있어야합니다 :'sum (key ('kOffspring', ID)/* [name (T)]/Stakes'/Stakes' 그리고 작동하는 것 같습니다.) = $ Pacers or name() = $ Trotters]/Stakes' :-) .... 그리고 '더 나은 방법'으로는 더 복잡한 xslt/xml이 최대 5 개를 갖는 것처럼 하나의 매개 변수로 그것을하는 것입니다. 관련된 다른 노드 – user1840734

+0

문자열의 시퀀스 인 $ Gaits 변수를 정의한 다음 이름이 그 중 하나와 동일한 경우 [name() = $ Gaits]가 true가됩니다. –

1
<xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" /> 

보행을 위해 전달 된 어떤 값에 따라 XML 트리의 노드 의 이름으로 별표 (*) 부분을 대체 할 수있는 방법이 있나요? 당신은 각각의 가능한 값에 대한 <xsl:value-of>, 하나의 세 가지 다른 버전을 쓸 수있다, 또는

sum(key('kOffspring', ID)/*[ 
    $Gait = 'A' or 
    (local-name() = (if ($Gait = 'P') then 'Pace' else 
         if ($Gait = 'T') then 'Trot')) 
    ]/Stakes) 

:

예 ... 하나의 방법은 XPath 식 내부의 "스위치 문"을 가지고하는 것입니다

<xsl:choose> 
    <xsl:when test="$Gait = 'A'"> 
     <xsl:value-of select="sum(key('kOffspring', ID)/*/Stakes)" /> 
    </xsl:when> 
    <xsl:when test="$Gait = 'P'"> 
     <xsl:value-of select="sum(key('kOffspring', ID)/Pace/Stakes)" /> 
    </xsl:when> 
    etc. 

<xsl:choose> 나에게 더 읽을 것, 그리고에 따라보다 효율적으로 수 있습니다 : $ 보행의, 그리고 <xsl:choose>을 사용하여 사용할 하나를 선택합니다 프로세서; 그러나 주로 선호의 문제입니다.

+0

안녕 라스를 사용합니다.답을 명확히하기 위해 'Sires'템플릿에서 경로를 포함하는 모든 '가치 - 선택'에 대해 '선택'또는 스위치 명령문을 반복해야합니까? (실제 xslt에는 약 30 개의 문이 있습니다)? 나는 '- 그런 일이 있니? – user1840734

+0

@OP : 나는 긴 질문을 빨리 읽었고 표현이 일종의 용도로 사용되었다는 것을 알아 채지 못했습니다. 내 잘못이야. 유감스러운 말로, 원하는 구문이 없습니다. '$ Gait'의 가치를 고려한 키를 유용하게 정의 할 수 있는지 궁금합니다.하지만 자러 갈 필요가 있습니다. :-) – LarsH