2009-04-06 4 views
18

고유성을 확인하기 위해 특정 값을 갖는 XML 파일의 요소 수를 계산해야합니다. XML 파일은 다음과 같습니다.주어진 값을 가진 XSLT 요소 계산

EDIT : 원본 "단순화 된"XML을 누군가가 설계 한 실제 털이 혼란으로 업데이트했습니다. 불행하게도, 이것은 이전의 모든 Answers를 편집하지 않는 한 정말로 혼란스럽고 틀리게 만듭니다.

<root> 
    <ac> 
    <Properties> 
    <Property Name="Alive"> 
     <Properties> 
     <Property Name="ID"> 
     <Properties> 
      <Property Name="Value"> 
      <long>11007</long> 
      </Property> 
     </Properties> 
     </Property> 
     </Properties> 
    </Property> 
    <Property Name="Dead"> 
     <Properties> 
     <Property Name="ID"> 
     <Properties> 
      <Property Name="Value"> 
      <long>11008</long> 
      </Property> 
     </Properties> 
     </Property> 
     </Properties> 
    </Property> 
    ... 
    <Property Name="MostlyDeadAllDay"> 
     <Properties> 
     <Property Name="ID"> 
     <Properties> 
      <Property Name="Value"> 
      <long>99001</long> 
      </Property> 
     </Properties> 
     </Property> 
     </Properties> 
    </Property> 
    </Properties> 
    </ac> 
</root> 

나는 템플릿 매개 변수에 정의 된 긴 값 (ID)가 어떻게 살아/죽은 수준에서 속성의 많은 볼 수있는 변수를 정의하려합니다. 이 줄을 따라 뭔가 (비록 내가 틀린 것 같아요 ...)

<xsl:param name="parPropId"/> 
<xsl:variable name="countProperties"> 
    <xsl:value-of select="count(/root/ac/ 
     Properties/Property/ 
     Properties/Property[@Name = 'ID']/ 
     Properites/Property[@Name = 'Value']/long = $parPropId)"/> 
</xsl:variable> 

"ID"수준에서 정의 된 여러 속성 요소가있을 수 있습니다. 그러나 "ID"아래에 하나의 속성 요소 ("값")가 있고 "값"아래에 하나의 "긴"요소 만있을 수 있다는 것이 확실합니다.

[면책 조항] [전체 이용가] 전체 XML 파일을 설계 한 사람은 누구나 XML을 구조화하는 방법을 알지 못했습니다 (예 : 속성 대 요소의 역방향 사용). 결과적으로 내 XSLT 사고가 일시적으로 뒤틀린 것을 두려워합니다. [/ 면책 조항]

+0

왜 잘못 표시했는지 XPath 표현식이 맞습니까? 나는 그것에 문제가있는 것을 보지 못했다. – Cerebrus

+0

확실하지 않습니다. 위의 XML을 단순화했습니다. 실제 xpath는 "/// Properties/Property/Properties/Property [@Name = 'ID']/Properties/Property [@Name = 'Value']/long입니다. 당신이 맞으면 "/ long"을 "[long = $ parPropId]"로 바꿀 수 있습니다. 두 개의 "[]"작전이 함께 이루어지기 때문에 잘못 된 것 같습니다. –

+0

vartec의 text()가 올바른 텍스트를 제공한다는 것을 확인했습니다 (예 : "/// 속성/속성/속성/속성 [@Name = 'ID']/속성/속성 [@Name = '값']/long/text) "내 ID를 얻지 만 자신의 방법을 사용하여 계산 한 결과가 여전히 실패했습니다 –

답변

36

이 XPath는 : 것을 제외하고 ...

count(//Property/long[text() = '11007']) 

:

count(//Property[long = '11007']) 

가 같은 값을 반환 첫 번째는 기준과 일치하는 노드를 Property으로 계산하고 두 번째는 기준과 일치하는 long 자식 노드를 계산합니다.

귀하의 의견에 따라 몇 번 질문을 읽으면서, 나는 당신이 기준의 조합에 따라 고유성을 찾고 싶다고 믿습니다. 따라서 실제로는 여러 조건을 실제로 확인하고 있다고 생각합니다. 다음은 잘 작동 :

count(//Property[@Name = 'Alive'][long = '11007']) 

을이 같은 일을 의미하기 때문에 : 물론

count(//Property[@Name = 'Alive' and long = '11007']) 

, 당신은 당신의 템플릿 매개 변수의 값을 대체 할 것입니다. 위의 코드는 그 요점을 보여줍니다.(질문 편집 후)

편집


당신은 XML 끔찍한 것에 대해 매우 잘했다. 사실, 이것은 솔직한 CodingHorror 후보입니다! 나는 내가 현재 가지고 있던 "Property"노드를 추적하기 위해 계속 더 자세히 설명해야했습니다. 나는 너의 고통을 느낀다! 여기

당신은 이동 : 나는 (ID과 가치를 위해) 다른 모든 검사를 제거한

count(/root/ac/Properties/Property[Properties/Property/Properties/Property/long = $parPropId]) 

참고. XML의 계층 구조를 사용하여 관련 노드에 도달 할 수 있으므로 필요하지 않은 것처럼 보입니다. 또한 유일성에 대한 검사는 long 요소의 내용만을 기반으로한다고 언급했습니다.

+0

이 xpath 등가물에 대해 저에게 교육 해 주셔서 감사합니다! 너희들이 말하는 모든 것이 (XSL/XPath의 적당한 수준의 경험을 바탕으로) 완벽하게 이해된다. 실제로, 나는 여러 기준을 가지고 있지 않습니다. ID는 제가 아끼는 모든 것입니다. 0이 아닌 값 [arrrgghh]을주기 위해 그 카운트를 얻을 수 없습니다. –

+0

놀랍게도 이러한 농담을하는 사람들은 때로는 '긴'대신 '문자열'과 'int'를 사용합니다. 당신은 나에게 CodingHorror에 복종하도록 동기를 부여했습니다! 나는 솔루션의 '/ long'부분을 제거했다. 나는 이것을 대답으로 표시하고 있으며, 나와 함께 지내는 것에 대해 백만 달러 감사합니다. –

-2
<xsl:variable name="count" select="count(/Property/long = $parPropId)"/> 

취소는 테스트하지만 난 그 일을한다고 생각합니다. 내가 속성 노드가 루트 노드의 직접 자녀 있으리라 믿고있어 및 그이 peformance

에 대한 귀하의 하위 선택을 복용 는
2

당신의 XPath는 오프 조금있다 :

count(//Property/long[text()=$parPropId]) 

편집 : Cerebrus은 매우 옳게 지적 OP의 코드 (노드의 암시 적 값 사용)는 사용자의 목적에 따라 절대적으로 좋습니다. 사실, "긴"노드가 아닌 "속성"노드로 작업하기를 원할 가능성이 높기 때문에 은 text() xpath보다 //Property[long=$parPropId]을 요청할 수 있습니다. 그러나 후자의 경우를 만들 수는 있습니다 가독성 근거.

는 내가 좀 피곤 오늘 : 야, 무슨 말을 할 수

+0

맞춰보세요! 지금 666 개의 답을 얻었습니다. 중요! – Cerebrus

+0

그리고 완전히 우연히도 Dimitre의 뒤가 있습니다. – annakata

+0

그리고 우연히도 아니야, 안나 카타는 모든 통신을 다시 삭제한다. 그것은 그/그녀의 대답에 실제로 어떤 것이 잘못되었는지 설명합니다. –