2010-04-06 6 views
4

이것은 매우 간단한 질문 일 수 있지만 그 중 하나는 얻을 수없는 것 같아서 머리카락을 찢어 버리고 있습니다. 나는 다음과 같은 XML이 :XSL 및 네임 스페이스

<?xml-stylesheet type="text/xsl" href="email.xsl"?> 
<Example xmlns=""> 
    <Name xmlns="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1">Mark</Name> 
</Example> 

을 그리고 다음 XSLT 사용하는 것을 시도하고있다 : 나는 제거 할 때

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
> 
    <xsl:template match="/"> 
    <html> 
     <body> 
     <table width="90%" border="0" cellpadding="0" cellspacing="0"> 
      <tr> 
      <td> 
       <p>AUTOMATED CONFIRMATION: This confirmation email is unable to take replies. For further assistance please visit our Help pages or Contact us</p> 
       <p>Dear <xsl:value-of select="Name"/>,</p> 
       <p>Thank you for blah blah... </p> 
      </td> 
      </tr> 
     </table> 
     <xsl:apply-templates/> 
     </body> 
    </html> 
    </xsl:template> 
</xsl:stylesheet> 

내가, 내가 XML 피드에서 xmlns=urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1을 사용하고 때 표시 할 이름을 얻을 수 있습니다 xmlns, 이름이 잘 표시됩니다.

일부 구문이 있습니까?

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:rpg="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1" 
> 

가 그럼 난 XPath 식의 XSLT에게 준 접두사를 사용하여 :

<xsl:value-of select="Name"/> 

을하지만이 중 하나가 작동하지 않습니다 나는 <xsl:stylesheet> 요소에 네임 스페이스를 추가하는 시도했습니다. 누구든지 도와 줄 수 있습니까? 미리 감사드립니다.

답변

0

이 대안 조건 및 로컬 -를 사용하여 지금 당신은 할 수있어 모든 접두사도 사용입니다 이름(). 예 :

<xsl:value-of select="*[local-name() = 'Name']"/> 
+0

이것은 비효율적 일뿐만 아니라 (문자열 비교로 인해 느려서) 실제로 네임 스페이스를 고려하지 않기 때문에 좋지 않은 아이디어입니다. – Lucero

+1

... 네임 스페이스가 관련된 경우 (다른 네임 스페이스에 대해 다른 동작이 필요한 경우). XSL이 관심이있는 원시 XML의 내용을 포맷하는 경우 네임 스페이스는 그다지 관련이 없으며 무시할 수 있습니다. OP 예제에서 네임 스페이스는 출력 XML에 보존되지 않도록 * 요소의 텍스트 내용 만 유지됩니다. 성능 문제가 확실하지 않습니다. XPath 함수 정의에 따라 "* [name() = name]"은 "name"과 동일 함을 기억하십시오. 어쨌든 컴파일러는 XPath 표현식을 최적화 할 목적으로 XPath 표현식을 '다시 작성'할 수 있습니다. – user268396

+0

+1 부정적인 점수를받을만한 나쁜 대답이나 잘못된 대답은 아닙니다. 그것에는 몇 가지 함의가 있지만 이름이 지어졌습니다. 성능 인수는 현재 노드에있는 자식 수와 XSLT 프로세서가 얼마나 잘 최적화되어 있는지에 따라 크게 달라집니다.네임 스페이스 인수는 당신이 신경 써야하는지 아닌지에 달려 있습니다. ;) – Tomalak

4

Name의 XPath 표현식이 일치하도록 XSLT에서 동일한 네임 스페이스를 사용해야합니다.

<xsl:value-of select="x:Name" xmlns:x="urn:rnb.fulfilment.bus.contracts.public.exampleBookName.v1"/> 
+2

XSL 튜토리얼 예제의 네임 스페이스가 거의 없기 때문에 불행한 점은 일반적인 혼란입니다. 요소와 관련된 네임 스페이스가있는 경우 XSL과 관련하여 해당 이름은 단순한 이름이 아닌 정규화 된 이름 (http://en.wikipedia.org/wiki/QName)입니다. –

+0

'xsl : value-of'에서 네임 스페이스를 선언하면 XSL 코드가 불필요하게 커지기 때문에 이것이 최선의 방법은 아닙니다. 문서 수준에서 그들을 선언하는 것은 갈 길입니다. – Tomalak

+0

@Tomalak, 네임 스페이스가 사용되는 범위에 따라 다릅니다. 이 엘리먼트에서만 사용된다면, 이와 같이 사용하면 접두어가 나타내는 네임 스페이스가 명확해진다. 물론 네임 스페이스를 여러 곳에서 사용하려면 문서로 이동해야합니다. – Lucero

6

<xsl:stylesheet>에 네임 스페이스를 선언하는 방법이 올바른 방향이었습니다.

<xsl:value-of select="Example/rpg:Name" /> 

내가 더 나은 귀하의 의견을 반영하기 위해 템플릿에 작은 변화를 추천 :

<xsl:template match="Example"> 
    <!-- ... --> 
    <xsl:value-of select="rpg:Name" /> 
</xsl:template>