2010-06-07 6 views
3

XML 문서의 일괄 처리에 XSLT 변환을 적용하려고합니다. 변환의 핵심은 여러 요소를 재정렬하는 것입니다. 너무 많은 의견을 잡고xslt & xpath : 직전의 설명과 일치합니다.

<xsl:template match="element"> 
    <xsl:copy-of select="preceding-sibling::comment()"/> 
</xsl:template> 

: 나는 솔루션에 왔어요 가장 가까운 표현을 사용하는 것입니다

<!-- not this comment --> 
<element /> 

<!-- this comment --> 
<!-- and this one --> 
<element /> 

: 나는 직접가 요소보다 우선 의견을 유지하고자하는

<!-- not this comment --> 
<!-- this comment --> 
<!-- and this one --> 

필자는 앞서 언급 한 XPath가 올바르게 작동하지 않는 이유를 알고 있지만 진행 방법에 대한 좋은 아이디어가 없습니다.

preceding-sibling::comment()[following-sibling::reference_to_current_element() or following-sibling::comment()] 

답변

5
<xsl:template match="element"> 
    <xsl:copy-of select="preceding-sibling::comment()[ 
    generate-id(following-sibling::*[1]) = generate-id(current()) 
    "/> 
</xsl:template> 

보다 효율적인 :

<xsl:key 
    name = "kPrecedingComment" 
    match = "comment()" 
    use = "generate-id(following-sibling::*[1])" 
/> 

<!-- ... --> 

<xsl:template match="element"> 
    <xsl:copy-of select="key('kPrecedingComment', generate-id())" /> 
</xsl:template> 
+0

감사 솔루션은 완벽하게 작동합니다! 나는 generate-id()와 key()에 대해 읽어야 할 것이다. –

+0

@ Joshua Johnson : 키들에 관해서 : 저는 JavaScript의 예제에서 어떻게 작동하는지 설명하는 것을 작성했습니다. 원하는 경우 살펴보십시오. http://stackoverflow.com/questions/948218/xslt-3-level- grouping-on-attributes/955527 # 955527 (대답의 아래 부분 만 읽음). – Tomalak

1

내가 생각하는 내가 찾고 다음 - 형제 중 다른 의견이나 현재의 요소가 처리되는 모든 위의 의견을 선택하는 무언가이다 퍼팅하는 가장 좋은 방법은 다음과 같습니다 :

나는 preciding 코멘트를 원하지만, 현재 노드가있는 것들만 그들을 따라 가기를 원합니다.

그런 다음, xpath1.0/xslt1.0에 :

<xsl:template match="element"> 
<xsl:copy-of select="preceding-sibling::comment()[count(following-sibling::*[1]|current()) = 1]"/> 
</xsl:template> 
+0

+1 - 그러나 이것은 왜 짧은 설명이 부족합니다 * 왜 * 작동합니다. ;-) – Tomalak

+1

@Tomalak : 네가 맞아. 그 죄송합니다! 노드 집합의 모든 노드는 disctint입니다 (노드 집합에 "노드 참조"가 중복되지 않습니다). 따라서 실제로 두 노드가 같은 노드인지 확인하려면 generate-id() 함수가 필요하지 않습니다. (동일한 변환 프로세스에 노드에 대한 고유 한 ID 문자열을 보장합니다). 노조가 하나의 노드로 노드 집합을 생성하는지 확인하면됩니다. 이는 정체성 노드 집합 표현식에 대한 감소입니다 : "count ($ a | $ b) = count ($ b) and count ($ b) = count ($ a)". 번역을 위해 유감스럽게 생각하고, 나의 lenguage는 spanish이다. –