2010-08-03 4 views
1

요소 이름을 반환 할 것으로 예상되는 코드가 있지만 아무 것도 반환되지 않습니다.요소 이름 (XSL/XPath)에 대해 아무것도 반환되지 않았습니다.

다음 코드는 다른 XSL 문서를 생성하는 XSL 문서의 코드입니다. 여기서 $ expression은 XPath 식을 동적으로 만든 변수입니다.

<xsl:template match="/"> 
    ... 
    <xslt:template match="{$expression}"> 
     <elem key="{name()}"> 
      <xslt:copy-of select="@*"/> 
      <xslt:for-each select="@*"> 
       <xslt:sort select="name()"/> 
       <attribute>|<xslt:value-of select="name()"/>|</attribute> 
      </xslt:for-each> 
     </elem> 
    </xslt:template> 
    ... 
</xsl:template> 

그런 다음이 코드는이 코드로 두 번째 XSL 문서를 생성합니다. @key가 비어있는 것에주의하십시오.

<xsl:template match="//*[@name='Spot']"> 
    <elem key=""> 
     <xsl:copy-of select="@*" /> 
     <xsl:for-each select="@*"> 
      <xsl:sort select="name()" /> 
      <attribute>|<xsl:value-of select="name()" />|</attribute> 
     </xsl:for-each> 
    </elem> 
</xsl:template> 

@key가 비어있는 것 외에 모든 것이 예상대로 작동합니다. 내 유일한 문제는 요소의 이름을 표시하는 것입니다.

편집 : 실제로 무엇을 찾고 있는지 명확히하기 위해 <xslt:template match="{$expression}">에 의해 반환 된 결과의 요소 이름이 필요합니다.

감사합니다. :)

+0

'name()'함수는 현재 노드를 기반으로 작동하므로 여기에 사용 된 주변 템플리트 (또는 for-each 루프)를 제공해야합니다. – Welbog

+0

@Welbog : 유일한 "주변"템플리트 또는 for - each는 코드의 첫 번째 섹션에 대한 입니다. 비록 그것이 지나치게 유용하다면 확실하지 않습니다. – developer

+1

@iHartGreek : 세상의 모든 변화를 가져옵니다. – Welbog

답변

1

당신의 변환이 XSLT 코드 자체를 생산하고 그 결과에 갖고 싶어하기 때문에 :

<elem key="{name()}"> 

당신이 탈출해야 {}의 AVT 즉시 평가되지 않도록.

"속성 값 템플릿이 가 인스턴스화, 이중 왼쪽 또는 오른쪽 중괄호 :이 XSLT spec에 규정을 두 배로하여 수행됩니다대로-{}을 생산

표현을 벗어나면 은 하나의 중괄호로 바뀝니다."

따라서, 교체 :

<xslt:template match="{$expression}"> 
    <elem key="{{name()}}"> 
     <xslt:copy-of select="@*"/> 
     <xslt:for-each select="@*"> 
      <xslt:sort select="name()"/> 
      <attribute>|<xslt:value-of select="name()"/>|</attribute> 
     </xslt:for-each> 
    </elem> 
</xslt:template> 

과 결과로 당신이 얻을 것이다 :

<xslt:template match="{$expression}"> 
    <elem key="{name()}"> 
     <xslt:copy-of select="@*"/> 
     <xslt:for-each select="@*"> 
      <xslt:sort select="name()"/> 
      <attribute>|<xslt:value-of select="name()"/>|</attribute> 
     </xslt:for-each> 
    </elem> 
</xslt:template> 

<xsl:template match="//*[@name='Spot']">  
    <elem key="{name()}">  
     <xsl:copy-of select="@*" />  
     <xsl:for-each select="@*">  
      <xsl:sort select="name()" />  
      <attribute>|<xsl:value-of select="name()" />|</attribute>  
     </xsl:for-each>  
    </elem>  
</xsl:template> 

:이 코드는 전혀 작동하지 않습니다. <xsl:namespace-alias> XSLT 명령어를 사용해야합니다.

+0

감사합니다! {works :)로 이스케이프 처리하지만 마지막 메모에서 어떤 의미인지 확실하지 않습니다. 첫 번째 XSL 문서 상단에 을 사용하고 있습니다. – developer

+0

@iHartGreek : 이제 알겠습니다. "xsl"과 "xslt"가 비슷하게 보이므로 xsl 만 사용하고 있다고 생각했습니다. :) –

+0

haha ​​yes they do! 간단하고 정확한 답변을 주셔서 다시 한 번 감사드립니다! – developer

0

/은 루트 노드 자체가 아닌 XML 문서의 루트 노드를 포함하는 노드를 반환합니다. 이 노드에는 이름이 없습니다.

당신은 그 노드의 자식 이름을 원한다고 생각합니다. 당신은 여러 가지 방법으로 그것을 할 수 있습니다. 하나는 <xsl:template match="/"><xsl:template match="/root"> (여기서 root은 루트 노드의 이름이 무엇이든간에)으로 변경하거나 <elem key="{name()}"><elem key="{name(root)}">으로 변경할 수 있습니다.

하지만 이름을 미리 알지 못할 수도 있습니다. 이 경우 <xsl:template match="/*">으로 갈 수 있습니다. 그러면 루트 부모의 모든 자식이 반환됩니다. 이 경우 항상 하나의 루트 만 존재합니다. 그런 다음 <elem key="{name()}">을 정상적으로 사용할 수 있습니다.

+0

죄송합니다. 도움이된다고 생각하지 않습니다. 첫 번째 XSL 문서에 사용 된 XML 문서의 루트 요소 이름이 아닌 에서 XPath 표현식에서 반환 된 결과의 요소 이름을 찾아야합니다. (첫 번째 XSL 문서에 사용 된 XML 문서는 두 번째 XSL 문서에 사용 된 XML 문서와 다르므로 매우 다른 데이터가 사용됩니다) – developer

관련 문제