요소의 XSLT 이름이 있습니까?


101

XSLT에는

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

요소의 값을 얻으려면 요소의 태그 이름을 선택하는 것이 있습니까?

다음과 같은 상황에서 :

<person>
  <!-- required stuff -->
  <name>Robert</name>
  <!-- optional stuff, free form for future extension. 
       Using XMLSchema's xsd:any -->
  <profession>programmer</profession>
  <hobby>photography</hobby>
</person>

<xsl:for-each select="person">
   <xsl:tag-of select="."/> : <xsl:value-of select="."/>
</xsl:for-each>

다음과 같은 출력을 얻으려면 :

name : Robert
profession : programmer
hobby : photography

물론 위의 XSLT는 컴파일되지 않습니다.

 <xsl:tag-of select="expression"/>

존재하지 않습니다. 그러나 이것은 어떻게 할 수 있습니까?


이 질문에 가장 관련있는 태그는 XPath입니다. 두 함수 모두 XPath 표준 함수이며 모든 호스팅 언어 (C #, XSLT, XQuery, ...)의 컨텍스트에서 XPath 표현식 내에서 사용할 수 있습니다. 태그를 다시 지정하십시오
Dimitre Novatchev

이 텍스트 : "XSLT에는 <xsd : value-of select ="expression "/>"-오류가 있습니다. XSLT 명령어에 일반적으로 사용되는 접두사는 "xsl"입니다. 일반적으로 XML 스키마를 사용할 때 접두사 "xsd"또는 "xs"를 사용합니다. 수정 해주세요.
Dimitre Novatchev

답변:


156

그러면 현재 요소 이름 (태그 이름)이 제공됩니다.

<xsl:value-of select ="name(.)"/>

OP-Edit : 이것은 또한 트릭을 수행합니다.

<xsl:value-of select ="local-name()"/>

12
local-name은 당신이 원하는 것입니다 10 번 중 9 번
annakata

20
local-name은 sans 네임 스페이스이므로 일반적으로 더 나은 이유입니다.
Jon W

102

아무도 함수 name()와 의 의미론에서 미묘한 차이를 지적하지 않았습니다 local-name().

  • name(someNode) 노드의 전체 이름을 반환하며 노드가 요소 또는 속성 인 경우 접두사와 콜론을 포함합니다.
  • local-name(someNode) 노드의 로컬 이름 만 반환하며 노드가 요소 또는 속성 인 경우 접두사와 콜론을 포함하지 않습니다.

따라서 이름이 두 개의 서로 다른 네임 스페이스에 속할 수있는 상황에서 name()이러한 이름을 계속 구별 하려면 함수를 사용해야합니다 .

그리고 BTW, 인수없이 두 함수를 모두 지정할 수 있습니다 .

name() 의 약어입니다. name(.)

local-name() 의 약어입니다. local-name(.)

마지막으로 , 요소와 특성에는 이름이있을뿐만 아니라이 두 함수는 PI에서도 사용할 수 있으며이 두 함수는 동일합니다.


15
<xsl:for-each select="person">
  <xsl:for-each select="*">
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/>
  </xsl:for-each>  
</xsl:for-each>

노드의 값을 가져올 때 항상 normalize-space ()를 사용하는 것이 좋은 방법입니다. <xsl : value-of select = "normalize-space (.)"/> 이렇게하면 추가 공백이 줄어 듭니다
SO User

이러한 정규화 / 정화는 입력 수집 단계에서 처리되지 않은 경우에만 필요합니다. 그런 다음 액세스 시간에 수행해야하는 시간을 절약 할 수 있으며, 일반적으로 훨씬 더 자주 수행됩니다. 하나는 RDB에 추가하기 전에이를 수행하고 xml 문서는 다른 데이터베이스 일뿐입니다.
Patanjali

9

관심있는 사람들에게는 다음이 없습니다.

<xsl:tag-of select="."/>

그러나 다음으로 이동하여 태그 / 요소를 다시 만들 수 있습니다.

<xsl:element name="{local-name()}">
  <xsl:value-of select="substring(.,1,3)"/>
</xsl:element>

이것은 예를 들어 많은 다른 요소에 대한 데이터 값 형식화를 처리하는 xslt 템플릿에서 유용합니다. 작업중인 요소의 이름을 모르는 경우에도 동일한 요소를 출력하고 필요한 경우 값을 수정할 수 있습니다.


6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/>

그럼 왜 이건 투표가 안됐을까요? Granted는 네임 스페이스도 원하지 않는 경우 local-name ()을 언급 할 수 있었지만, 이것이 작동하지 않는 이유를 설명하는 데 더 많은 커뮤니티에 유용 할 것입니다.
Rowland Shaw

아마도 주어진 XML을 변환 할 수 없었을 것입니다. 이 경우 이름 (.)은 "person"이됩니다. "이름", "직업"및 "취미"여야합니다.
Ray Lu

@CodeMelt 그렇다면 왜 수락 된 답변에 반대 투표를하지 않았습니까? 좋지만 이것보다 덜 구체적입니다. 나는 질문에 대한 답을 제공하기 때문에 Rowland Shaw의 답변을 찬성했습니다. 답변자에 잘못된 정보, 부정확하거나 오해의 소지가있는 정보가 포함 된 경우에만 반대 투표하십시오.
Dimitre Novatchev

4
사소한 세부 사항을 수정했습니다. 개인적으로 사람들은 집단 지식을 설명하는 데 도움이되므로 반대표를받은 이유를 사람들이 설명해야한다고 생각합니다.
Rowland Shaw

우리의 평판은 주목을 끌 수 있지만 게시 한 내용이 가치가 있다는 보장은 없기 때문에 실제로 중요한 것은 기여의 질입니다. 저질의 기여를하는 이유는 없습니다.
Patanjali
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.