2010-08-09 6 views
1

XPath 표현식 만 사용하면 (XSLT 또는 DOM이 아닌 순수한 XPath 만 사용) 현재 노드 (td)에서 관련 td까지 상대 경로를 만들려고합니다. 같은 HTML 표의 같은 열에XPath 1.0을 사용하여 HTML 표 열 탐색

<table> 
    <tr> <td><a>Blue Jeans</a></td> <td><a>Shirt</a></td> </tr> 
    <tr> <td><span>$21.50</span></td> <td><span>$18.99</span></td> </tr> 
</table> 

나는 "청바지"으로 a에있어 및 가격 ($ 21.50)을 찾으려면 :

예를 들어, 나는 이런 유형의 데이터가 있다고 가정합니다. XSLT, 나는 이렇게 답을 얻기 위해 현재의() 함수를 사용할 수 있습니다

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" /> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="//a" /> 
    </xsl:template> 

    <xsl:template match="a"> 
     Name: <xsl:value-of select="."/> 
     Price: <xsl:value-of select="../../following-sibling::tr[1]/td[position() = count(current()/../preceding-sibling::td) + 1]" /> 
    </xsl:template> 

</xsl:stylesheet> 

을하지만 실행 해요 문제가 있다는 것입니다 전류()의 XPath 1.0에 정의했다.하지 나는 self :: axis를 사용하려했지만 "." 단축형은 "현재"노드가 아니라 "컨텍스트"노드 만 가리킨다. XPath standard에서 볼 수있는 언어는 XPath에 "현재 노드"개념이 없음을 나타냅니다.

이 경로를 형성하는 또 다른 방법이 있을까요? 아니면 XPath의 제한 사항입니까?

답변

1

이 XPath는 1.0에서 당신이 할 수 있습니다 : 물론

/table/tr/td/a[.='Blue Jeans']/following::td[count(../td)]/span 

,이 더 열 병합이없는 가정합니다.

편집 : 증명. 이 스타일 :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:param name="pProduct" select="'Blue Jeans'"/> 
    <xsl:template match="/"> 
     <xsl:value-of select="/table/tr/td/a[.=$pProduct] 
            /following::td[count(../td)]/span"/> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

PARAM으로
$21.50 

pProduct 세트 'Shirt'에, 출력 :

$18.99 

참고 : 물론, 당신은 맥락에서 a 요소가 필요합니다 span 요소를 선택하십시오. 그래서, 당신의 스타일과 :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="text"/> 
    <xsl:template match="text()"/> 
    <xsl:template match="a"> 
     Name: <xsl:value-of select="."/> 
     Price: <xsl:value-of select="following::td[count(../td)]/span" /> 
    </xsl:template> 
</xsl:stylesheet> 

출력 :

Name: Blue Jeans 
Price: $21.50 
Name: Shirt 
Price: $18.99