2011-08-26 3 views
2

XSLT 또는 XML로 작업 한 것은 이번이 처음입니다. 실례합니다. 나는 XSLT 웹 문서가 매우 간결하다는 것을 발견했다.XSLT를 XML 전처리기로 사용하기

입력 집합 집합에 따라 내용을 선택적으로 삭제하기 위해 처리하려는 XML 파일이 있습니다. 이 동작은 ifdef 블록을 처리하는 간단한 코드 전처리 기와 유사해야합니다.

아래 내용을 수행하는 방법을 알아 냈습니다. 그러나 "내용"변수와 같은 일부 부분이이를 처리하는 가장 좋은 방법으로 보이지 않았습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" /> 
    <xsl:param name="defines-uri" required="yes"/> 

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

    <xsl:template match="ifdef"> 
    <xsl:variable name="contents" select="child::node()"/> 
    <xsl:variable name="defines" select="document($defines-uri)/defines"/> 
    <xsl:variable name="val" select="@select"/> 

    <xsl:for-each select="$defines"> 
     <xsl:if test="def=$val"> 
     <xsl:apply-templates select="$contents"/> 
     </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 

</xsl:stylesheet> 

주요 문제점은 정의에서 일치가 발견 된 경우 적용 템플릿입니다. 내용이 없으면 출력에서 ​​다른 수준으로 덤프 된 정의 문서를 가져옵니다.

변환하지 않고 XML 사전 처리를 수행하는 가장 좋은 방법은 무엇입니까?

+3

샘플 XML 문서와 예상 출력이 도움이 될 것입니다. – Tomalak

답변

1

나는 아래에서 설명하는 방법을 연구했지만 "내용"변수와 같은 일부 부분은이 문제를 해결하는 가장 좋은 방법으로 보이지 않았습니다.

글쎄, 기본적으로 옳다. 당신은 여전히하지만, 그것을 조금 향상시킬 수

<xsl:variable name="defines" select="document($defines-uri)/defines"/> 

<xsl:template match="ifdef"> 
    <xsl:variable name="this" select="."/> 

    <xsl:for-each select="$defines[def = $this/@select]"> 
    <xsl:apply-templates select="$this/node()" /> 
    </xsl:for-each> 
</xsl:template> 

<xsl:for-each> 컨텍스트 노드를 변경합니다. 그 안에 .은 반복되는 노드를 나타내며 <xsl:template>과 일치하지 않습니다.

즉, 변수에 "외부"컨텍스트를 붙여야한다는 것을 의미합니다. 이는 일반적인 관행입니다.

1

XSLT XML로 시작하는 사람에게 정말 잘하고 있습니다.

이 질문에 대한 대답은 아니지만, 난 그냥이 안전한 "기본적으로 사본을"이 될 수 있음을 말하고 싶었다 템플릿 :

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

너의 특정 기본 내장의 은혜로 작동 템플릿에. 그러나 기본 설정의 우선 순위가 낮기 때문에 템플릿을 추가 할 때 텍스트 노드 (또는 요소가 아닌 다른 요소)에 대해 이상한 동작이 발생할 수 있습니다.

+0

+1 - 동의합니다. OP의''가 실제로는 더 정교한 변환에서는 도움이되지 않는다는 점도 주목할 가치가 있습니다. – Tomalak