요소의 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.