문제
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']
제휴하지 않습니다 StackOverflow