조상의 속성을 선택하는 단계;"../.."는 작동하지만 "ancestor::<tagname>"은 작동하지 않습니다.

StackOverflow https://stackoverflow.com/questions/259656

  •  06-07-2019
  •  | 
  •  

문제

저는 XML 문서를 실행하면서 모든 요소를 ​​선택하고 일반적으로 트리에서 두 노드 위에 있지만 때로는 3~4개 노드 위에 있는 조상을 기반으로 링크를 만듭니다.대부분의 요소에 대해 다음을 사용합니다. <xsl:value-of select="translate(../../@name,$uc,$lc)" /> 잘 작동하지만 조상이 3개 정도 노드인 경우에는 다음을 사용하고 싶습니다. <xsl:value-of select="translate(ancestor::package/@name,$uc,$lc)" />, 그러나 이것은 작동하지 않습니다.

저는 Ruby의 xsltproc를 사용하여 XSL 변환을 수행하고 있습니다.

샘플 트리(예, XSLT가 포함되어 있습니다. 아니요, 처리하려는 것이 아닙니다.):

<package name="blork!" xmlns="http://xml.snapin.com/XBL">
  <xsl:template name="doSomething">
    <tokens>
      <token name="text-from-resource" export="public" />
    </tokens>
  </xsl:template>
</package>

내가 사용하는 XSL:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:s4="http://xml.snapin.com/XBL">
  <xsl:template match="/">
    <xsl:if test="count(//s4:token) >0">
      <xsl:text>Tokens!</xsl:text>
      <xsl:for-each select="//s4:token">
        <xsl:choose>
          <xsl:when test="@export='global'" />
          <xsl:otherwise>
            <xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

편집하다: 아 맞다. 선택 항목의 네임스페이스를 잊어버렸습니다.파서는 대부분의 경우 해당 조상을 올바르게 찾았지만 xsl이 있는 경우 여전히 찾을 수 없습니다.노드가 있고 대상 파일에는 xsl에 대한 네임스페이스가 없습니다.대상 파일은 프로덕션 코드이기 때문에 수정하지 않는 것이 좋습니다. 저는 단지 autodoc 도구를 작성하고 있을 뿐입니다.

도움이 되었습니까?

해결책

문제는 아마도 네임스페이스와 관련되어 있을 것입니다.샘플 트리에 해당 내용을 포함하지 않았습니다. 붙여넣은 내용을 좀 더 정확하게 설명할 수 있습니까?패키지 노드가 토큰 노드와 동일한 네임스페이스에 있다고 가정하고 다음을 시도해 보십시오.

<xsl:value-of select="translate(ancestor::s4:package/@name,$uc,$lc)" />

정규화되지 않은 이름만 테스트할 수도 있지만 속도는 느려집니다.

<xsl:value-of select="translate(ancestor::*[local-name()='package']/@name,$uc,$lc)" />

W3C 로컬 이름() 사양 여기.

다른 팁

네임스페이스 인식 XML 프로세서를 사용하는 한 대상 문서에서 'xsl' 접두사에 대한 네임스페이스를 선언하는 방법은 없다고 생각합니다.xsltproc 및 지정된 스타일시트를 사용하여 대상 문서를 변환하려고 할 때 오류가 표시되지 않습니까?

도구에서 사용 중인 XSLT 버전을 다시 확인할 수 있습니다.XSLT 1.0은 "ancestor::<tag>..."를 지원하지 않는다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top