2013-05-01 3 views
0

나는 이와 같은 XML을 가지고있다.XML 루트 노드를 총체적으로 참조하는 방법

<Root attr1="ABC"> 
    <Element1> 
     <Element2> 
      <Element3 />  
     </Element2> 
     <Element2> 
      <Element3 />  
     </Element2> 
    <Element1> 
</Root> 

나는이 문제를 처리하는 몇 가지 XSLT를 가지고 있고, 저런 이유로는 (따옴표없이) '루트'와 같은 루트 노드를 참조합니다.

이제 루트 노드가 호출된다는 점을 제외하고는 동일한 구조의 XML을 갖게 될 위치에 있습니다. 내 XSLT의 두 버전을 원하지 않기 때문에 좀 더 일반적인 방식으로 루트 노드를 참조 할 수 있습니다. 내가주의가 필요 주제에 내 독서에서 언급 한

<xsl:when test="/NewRoot/@attr1 = 'ABC'"> 

무슨 뜻인지의 예로서

...

<xsl:when test="/Root/@attr1 = 'ABC'"> 

또한 작동이 필요 참조가 루트 노드이고 Document 요소가 아닌지 확인하려면 XML의이 부분을 가정합니다.

<?xml version="1.0" encoding="UTF-8"?> 

도움이 언제나 감사합니다.

감사합니다.

답변

1

또는 속성 검사를 템플릿 일치 패턴에 넣는 것이 더 나을 수도 있습니다. 당신이 정말로 전체 경로와 함께 xsl:whentest를 사용해야하는 경우

<xsl:template match="/Root | /NewRoot"> 
     <xsl:apply-templates select="@*"/> 
    </xsl:template> 

<xsl:template match="/Root/@attr1[. = 'ABC'] | /NewRoot/@attr1[. = 'ABC']"> 
    <!-- now output here what you want to output if the condition is met --> 
</xsl:template> 

다음 test="/Root/@attr1 = 'ABC' or /NewRoot/@attr1 = 'ABC'"를 사용합니다.

+0

네 그러므로 우리가 작성할 필요가 없습니다 -

여기

우리는 잘 구성된 XML 문서가 정확히 하나의 상위 요소가 있어야한다는 사실을 사용하고 있습니다. 고마워요 나는 그때 루트 노드를 참조하는 '일반적인'방법이 아닌가? – Nerdio

+0

'name (/ *)'은 루트 노드의 이름을 반환하지만, XSLT 2.0 이상을 사용하지 않는 한 XPath 표현식에서이를 사용하는 것이 중요하지 않습니다. – davmos

2

더 일반적인 방식으로 루트 노드를 참조 할 수 있습니까?

그냥 사용 : XML 문서의 최상위 요소 (관계없이 이름)이 그 문자열 값이 문자열 인 attr1라는 이름의 속성을 가지고 정확히

/*/@attr1 = 'ABC' 

true()을 생성합니다 " 알파벳". 이 해냈어, /*[1]

관련 문제