2011-04-28 5 views
2

XSL을 처음 접했을 때 - 새 기능을 용서하십시오.xsl : key를 사용하여 일치하는 하위 항목의 속성 찾기

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xalan="http://xml.apache.org/xalan" 
    version="2.0"> 

    <xsl:output indent="yes" xalan:indent-amount="5" /> 
    <xsl:template match="text()" /> 

    <xsl:key name="glossterm-lookup-key" match="glossentry/@id" use="glossentry/glossterm" /> 

    <xsl:template match="glossary" > 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="glossterm"> 
     Key: <xsl:value-of select="." /> 
     Value: <xsl:value-of select="key('glossterm-lookup-key', .)" /> 
     <xsl:text> 
     </xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 
:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<glossary> 
    <glossdiv id='glossdiv-0'> 
     <title>0</title>    
     <glossentry id='dev-null'> 
      <glossterm>/dev/null</glossterm> 
      <glossdef> 
       snip... 
       <glossterm>bit bucket</glossterm> 
      </glossdef> 
     </glossentry> 
     <glossentry id='me'> 
      <glossterm>/me</glossterm> 
      <glossdef> 
       snip... 
       <glossterm>/dev/null</glossterm> 
      </glossdef> 
     </glossentry>   
    </glossdiv> 
</glossary> 

이 내가 작업했던 테스트 XSL은 다음과 같습니다

나는 (이 실제로 Jargon File의 DocBook으로 양식을 크게 냈다입니다) 입력 XML 문서가

내 목표는 <glossterm> 요소를 발견 할 때마다 을 glossterm/text()으로 지정하고 싶습니다. 예를 들어, <glossterm>/dev/null</glossterm>을 찾으면 dev-null을 받고 싶습니다.

저는 glossdef에있는 glossterms에만 관심이 있습니다.하지만 모든 것들을 위해 xsl : templates를 사용하고 있습니다. 테스트를 위해서 모든 glossterms에서 작업하고 있습니다.

나는 별도의 조회 문서를 작성하고 XML.com: Reading Multiple Input Documents에 설명 된 방법을 사용했지만 그 행운은 없었습니다.

힌트가 있습니까?

답변

2

그것은 당신의 설명에서 말할 조금 어렵다하지만 난 당신이

<xsl:key name="glossterm-lookup-key" match="glossentry/glossterm" use="text()" /> 

이 아이 glossterm의 텍스트에 키가 glossentry/glossterm 노드의 인덱스를 만들고 싶은 생각합니다. 기준은 다음과 같습니다

<xsl:value-of select="key('glossterm-lookup-key', .)/../@id" /> 

이 인덱스를 검색 현재 컨텍스트 노드의 텍스트를 사용하고 부모의 @id을 반환합니다.

+0

감사합니다! 나는 실제로 이와 비슷한 것을 시도했다. 나는 올바른 '사용'키를 사용하지 않고 있다고 생각한다. 도움을 감사하십시오. – Cooper

0

@ 짐 게리슨의 정답 외에, 이것은 당신의 문제에 대한 설명입니다. http://www.w3.org/TR/xslt#key

use 속성 가입일

표현식 키의 값을 지정이고; 표현식은 패턴과 일치하는 각 노드에 대해 한 번 평가됩니다.

키 선언해야한다는 것을 의미한다 :

<xsl:key name="glossterm-lookup-key" 
     match="glossentry/@id" 
     use="../glossterm" /> 
관련 문제