2013-11-23 4 views
1

NodeSet에 대한 XPath가있는 경우 - 다음 XSLT가 제공된 XPath와 일치하는 각 노드에서 반복됩니다. 그리고 "value-of"함수는 "."과 일치합니다. 일치하는 각 노드에서 데이터를 리턴해야합니다.XSLT for each, 위치() = 1

<xsl:for-each select="//some/X-Path/Here/*">
<xsl:value-of select="." />
</xsl:for-each">

내가 비록 단일 요소로는 XPath가 있다면? 갑자기 그 단일 노드를 통해 "for-each"를하는 것은 어리석은 것처럼 보입니다. 그러나 동일한 동작을 수행하는 XSLT에서 필적 할만한 "기능"을 찾을 수는 없습니다. 그러나 입력은 컬렉션이 아닌 단일 요소 일뿐입니다.

<xsl:match select="//some/X-Path/Here[1]">
<xsl:value-of select="." />
</xsl:match">

또는이 효과에 뭔가. 나는 명백한 것을 놓치고 있는가?

+1

당신은'시도? – halfbit

+0

예 - 그러면 출력 할 내용을 직접 출력하고 싶습니다. 나는 그 노드들을 가지고 실제로 무언가를 할 수 있기를 원한다. 즉, 그 노드의 가치를 원할뿐만 아니라 "현재"컨텍스트를 그 노드로 만들고 싶어서 그 노드 내부의 일부 값에 대해 for-each (예를 들어)를 수행 할 수 있습니다. 말이 돼? – eejai42

+0

싱글 렛 노드 집합에 대해 각자 조금씩 어색해 보일지 모르지만 필요로하는 것만 정확하게 수행 할 수 있으므로 추가 구성으로 언어를 복잡하게 할 필요가 없습니다. for-each와 정확히 똑같은데, 하나 이상의 노드를 주면 불평을하는 것입니다. –

답변

3

글쎄, 당신은 기본적으로 자신의 질문에 대답했다. 크기가 하나 인 노드 집합을 반복 할 때 이 약간 이상하게 보일 수 있지만 다른 방법이 있습니다. 하나는 일치 템플릿을 작성한 것이며 <apply-templates>을 통해 호출했습니다. 다른 방법은 @halfbit가 제안한대로 직접 값을 삽입하는 것입니다. IMHO 무엇이 가장 좋은 방법인지 말하는 것은 매우 어렵습니다. 그것은 틀림없이 문맥에 달려 있습니다.

그러나 을 사용했을 때와 비교하여 <for-each>을 사용하면 두 가지 생각을 더 할 수 있습니다.

  • 실제로 항상 실행되는 반면 후자 존재하는 경우 이전에만 실행한다. <value-of> 부분은 비어 있어야하지만, 출력물을 망칠 수있는 래퍼로 둘러 쌓인다면 불편할 수 있습니다. 환언에

    ... 
    <xsl:for-each select="//some/X-Path/Here/*"> 
        output something here 
        <xsl:value-of select="." /> 
        output something here 
    </xsl:for-each"> 
    ... 
    

    블록에 대한 암시 경우 조건 반면에, 구조물

    ... 
    output something here 
    <xsl:value-of select="//some/X-Path/Here/*" /> 
    output something here 
    ... 
    

    하지 않는 갖는다. 그래서, 당신은 다음 <if>하여 포위 할 것이다 :

    ... 
    <xsl:if test="//some/X-Path/Here/*"> 
        output something here 
        <xsl:value-of select="//some/X-Path/Here/*" /> 
        output something here 
    <xsl:if> 
    ... 
    
  • 다른 점은 <for-each> 태그가 당신의 경로 아래 요소보다 더 많은 액세스하려는 경우 편리 할 수있는 컨텍스트 노드를 변경하는 것이 당신의 XPath. 따라서, 예를 들어,

    ... 
    <xsl:for-each select="//some/X-Path/Here/*"> 
        <xsl:value-of select="@attr1" /> 
        <xsl:value-of select="@attr2" /> 
        <xsl:value-of select="@attr3" /> 
        ... 
        <xsl:value-of select="@attrN" /> 
    </xsl:for-each"> 
    ... 
    

    은 긴 XPath 식을 갖고, 특히

    ... 
    <xsl:if test="//some/X-Path/Here/*"> 
        <xsl:value-of select="//some/X-Path/Here/*/@attr1" /> 
        <xsl:value-of select="//some/X-Path/Here/*/@attr2" /> 
        <xsl:value-of select="//some/X-Path/Here/*/@attr3" /> 
        ... 
        <xsl:value-of select="//some/X-Path/Here/*/@attrN" /> 
    <xsl:if> 
    ... 
    

    보다 (그리고 쉽게 읽을 수 있습니다) 간단하게 짧습니다. `: <= "// 일부 /의 X-경로/여기에 [1]"/ 선택 가치의 XSL>

+0

사려 깊고 완전한 응답 Marcus에 감사드립니다! 당신은 그것을 못 박았습니다. 나는 for-each의 "컨텍스트 스위칭"측면을 얻으 려하지만 다음과 같이 하나의 선택으로 구문 적으로 더 많은 인라인을 시도하려고한다. ) 또는 뭔가. – eejai42

+1

예, 저는 종종 xsl : for-each보다 더 읽기 쉬운 것이 있으면 좋겠다고 생각했지만 가독성을 위해 100 % 중복 구조를 추가하는 것은 잘못된 것처럼 보입니다. –

관련 문제