문제

XML 스 니펫 :

<AA>
  <BB>foo</BB>
  <CC>bar</CC>
  <DD>baz</DD>
  <EE>bar</EE>
</AA>

모든 자식 노드를 어떻게 선택합니까? <AA> 그건 가지고 있습니다 bar 내용물로? 위의 예에서는 선택하고 싶습니다 <CC> 그리고 <EE>. 솔루션은 다음과 같습니다.

<xsl:template match="AA">
  <xsl:for-each select="???" />
</xsl:template>
도움이 되었습니까?

해결책

OP의 질문에 가장 간단한 솔루션 중 하나는 다음 XPath 표현식입니다.:

*/*[.='bar']

XSLT 명령어가 관여하지 않는다는 점에 유의하십시오. 이것은 단지 XPath 표현입니다., 따라서 질문은 XPath로만 태그를 지정할 수 있습니다.

여기에서 선택한 모든 노드에 템플릿을 적용하는 등 다양한 방식으로 XSLT 에서이 XPath 표현식을 사용할 수 있습니다..

예를 들어, 아래는 XML 문서를 취하고 다른 요소 (어린이)의 다른 요소를 생성하는 XSLT 변환입니다. <AA> 그의 내용은 동일하지 않습니다 "bar" 삭제됩니다 :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

    <xsl:template match="node()|@*">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="AA">
      <xsl:copy>
         <xsl:apply-templates select="*[. = 'bar']"/>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

이 변환이 원본 XML 문서에 적용될 때:

<AA>
    <BB>foo</BB>
    <CC>bar</CC>
    <DD>baz</DD>
    <EE>bar</EE>
</AA>

원하는 결과가 생성됩니다:

<AA>
   <CC>bar</CC>
   <EE>bar</EE>
</AA>

주목하십시오:

일치 패턴에서 우리는 일반적으로 절대 XPath 표현식을 지정할 필요가 없으며 상대 표현식 만 지정할 필요가 없으므로 전체 XPath 표현식은 자연스럽게이 매치 패턴으로 단순화됩니다.

*[. = 'bar']
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top