2010-02-17 3 views
3

특정 요소 (b)의 형제를 따르지만 다른 b 요소보다 먼저 오는 요소 인 XPath 1.0 (또는 Regex과 함께있을 수 있음)을 선택하려고합니다.XPath "형제를 따르기 전에"

<img><b>First</b><br>&nbsp;&nbsp; 
<img>&nbsp;&nbsp;<a href="/first-href">First Href</a> - 19:30<br> 
<img><b>Second</b><br>&nbsp;&nbsp; 
<img>&nbsp;&nbsp;<a href="/second-href">Second Href</a> - 19:30<br> 
<img>&nbsp;&nbsp;<a href="/third-href">Third Href</a> - 19:30<br> 

가능한 한 실제 세계에 가까운 샘플을 만들려고했습니다. 이 시나리오에서 그래서 나는 요소에있을 때

<b>First</b> 

나는

<a href="/first-href">First Href</a> 

을 선택해야하고 내가

<b>Second</b> 

에있을 때 나는

<a href="/second-href">Second Href</a> 
<a href="/third-href">Third Href</a> 
을 선택해야합니다

그 아이디어를 얻으려면 어떻게해야할까요? 고맙습니다! 'XXXX'는 현재 <b>의 텍스트로 대체

following-sibling::a[preceding-sibling::b[1][.='xxxx']] 

:

+0

xml이 잘 형성되었다고 가정 할 수 있습니다. 즉, 'br' 요소는 실제로'
'입니까?또한'img' 엘리먼트는 내용을 가지고'/>'로 끝나야합니까? XPath가 옵션이 아니면 "실제 세계"에 잘 구성된 XML이 포함되어 있다면 정말 도움이 될 것입니다. – AnthonyWJones

+0

실세계의 예이기는하지만 물론 잘 형성되어 있지 않습니다. 그랬 으면 좋겠어 :(그러나, 나는 HTML 민첩성 팩 (. NET)을 사용하여 마크 업을 처리하고 그것이 도움이된다면 부적당 한 문서를 허용한다. –

+0

"실제 세계"는 말을 암시 할 이유가 없다. -formed xml 잘 구성된 xml로 전달 된 html의 예가 많이 있습니다. 물론 시나리오를 명확하게 만들었을 때의 민첩성에 대해 언급 해 주셨습니다. 적절한 태그 추가 – AnthonyWJones

답변

5

동적이 XPath를 만들 수 있습니다.

이것은 실제로 모든 요소가 형제임을 가정합니다. 일치하지 않으면 precedingfollowing 축을 사용하여 작업하거나 문서 구조와 더 유사한보다 구체적인 XPath를 작성할 수 있습니다.

XSLT에서 당신은 또한 사용할 수 있습니다 여기에

following-sibling::a[ 
    generate-id(preceding-sibling::b[1]) = generate-id(current()) 
] 
1

는 단지 하나의 XPath 식있는 솔루션 입니다. 우리는 단순히 현재 <b> 노드를 따라 <a> 형제의 노드 세트로 $ns1을 대체하고, 우리는 노드 세트와 $ns2을 대체

$ns1[count(. | $ns2) = count($ns2)] 

두 nodesets $ns1$ns2의 교차의 Kaysian 공식을 사용

<a> 다음에 오는 형제는 <b> 노드입니다. 여기

은 사용하는 전체 변형 인이 : 올바른 결과
를 제작

<t> 
    <img/> 
    <b>First</b> 
    <br />&#xA0;&#xA0; 
    <img/>&#xA0;&#xA0; 
    <a href="/first-href">First Href</a> - 19:30 
    <br /> 
    <img/> 
    <b>Second</b> 
    <br /> 
    <img/>&#xA0;&#xA0; 
    <a href="/second-href">Second Href</a> - 19:30 
    <br /> 
    <img/>&#xA0; 
    <a href="/third-href">Third Href</a> - 19:30 
    <br /> 
</t> 

:이 변환은 다음과 같은 XML 문서에인가

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/"> 
    <xsl:apply-templates select="*/b"/> 
    </xsl:template> 

    <xsl:template match="b"> 
    At: <xsl:value-of select="."/> 

    <xsl:variable name="vNextB" select="following-sibling::b[1]"/> 

    <xsl:variable name="vA-sAfterCurrentB" select="following-sibling::a"/> 

    <xsl:variable name="vA-sBeforeNextB" select= 
    "$vNextB/preceding-sibling::a 
    | 
    $vA-sAfterCurrentB[not($vNextB)] 
    "/> 

    <xsl:copy-of select= 
    "$vA-sAfterCurrentB 
       [count(.| $vA-sBeforeNextB) 
       = 
       count($vA-sBeforeNextB) 
       ] 
    "/> 
    </xsl:template> 
</xsl:stylesheet> 

:

At: First <a href="/first-href">First Href</a> 
    At: Second <a href="/second-href">Second Href</a> 
<a href="/third-href">Third Href</a> 
관련 문제