2012-05-22 2 views
3

처리 중에 결과 문서에 액세스 할 수 있는지 궁금합니다.XSLT 변환 중에 출력 문서의 특정 지점에 요소를 삽입하십시오.

내가 묻는 이유는 입력 된 문서를 변환하고 일부 조건에 따라 요소를 삽입하려고하지만 이것이 트리를 가로 질렀을 때 발생해야하고 거의 만들 때입니다. (상기 XML 직렬화 전) <instance> 태그 액세스 추가 <data> 요소를 삽입,

<xform> 
    <xforms> 
     <model> 
      <instance> 
       <data /> 
       <data /> 
      </instance> 
     </model> 
     <bind /> 
     <bind /> 
     <bind /> 
    </xforms> 
</xform> 

I 의도, 변환시 :

변환 된 XML이 비슷한 보인다.

참고 입력 문서가 위의 XML과 다릅니다. 위의 XML은 변형이 생성해야하는 것입니다.

마찬가지로, <xform> 요소에 액세스하여 추가 <bind> 노드를 삽입하고 싶습니다. 어떤 도움에 감사드립니다

<xform> 
    <xforms> 
     <model> 
      <instance> 
       <data /> 
       <data /> 
       <data>new data node</data> 
       <data>second new data node</data> 
      </instance> 
     </model> 
     <bind /> 
     <bind /> 
     <bind /> 
     <bind>new bind node</bind> 
     <bind>second new bind node</bind> 
    </xforms> 
</xform> 

:

그래서 최종 문서 (I 2 개 데이터 노드와 2 개 바인드 노드를 추가 가정)과 같을 것이다.

답변

3

아니, 당신은 할 수 없습니다 결과 문서에 액세스하는 경우 변수에 임시 트리를 만든 다음 필요한 경우 다른 모드로 템플릿을 사용하여 다시 트리를 처리 할 수 ​​있습니다. 따라서 예를 들어

<xsl:template match="/"> 
    <xsl:result-document href="example.xml"> 
<xform> 
<xforms> 
    <model> 
    <instance> 
    <data> 
    </data> 
    </instance> 
    </model> 
    <bind /> 
    <bind /> 
    <bind /> 
</xforms> 
</xform> 
    </xsl:result-document> 
</xsl:template> 

변수에 첫 번째 결과를 만든 다음 예를 들어

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

<xsl:template match="/"> 
    <xsl:variable name="temp1"> 
<xform> 
<xforms> 
    <model> 
    <instance> 
    <data> 
    </data> 
    </instance> 
    </model> 
    <bind /> 
    <bind /> 
    <bind /> 
</xforms> 
</xform> 
</xsl:variable> 
    <xsl:result-document href="example.xml"> 
    <xsl:apply-templates select="$temp1/*"/> 
    </xsl:result-document> 
</xsl:template> 

<xsl:template match="instance"> 
    <xsl:copy> 
    <xsl:apply-templates/> 
    <data>...</data> 
    </xsl:copy> 
</xsl:template> 

이 샘플에서는 모드를 사용하지 않지만 변수와 다른 처리 단계에서 샘플을 사용하여 다른 단계의 각 단계마다 템플릿을 구분할 수 있습니다.

+0

위에 붙여 넣은 xml은 입력 된 문서가 아니며 변환이 의미하는 것입니다. –

+0

감사합니다 마틴, 당신의 대답은 실제로 올바른 해결책으로 이끌었습니다. 나는 조작을 위해 나중의 템플릿에 전달하는 변수에 첫 번째로 처리 된 노드를 유지하기로 결정했다. 나는이 대답을 받아 들일 것이다. –

1

예, 이렇게하는 방법은 멀티 패스 처리와 :

<xform> 
    <xforms> 
     <model> 
      <instance> 
       <data> 
       </data> 
      </instance> 
     </model> 
     <bind /> 
     <bind /> 
     <bind /> 
    </xforms> 
</xform> 

이 변환이 제공된 XML 문서에 적용

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

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

<xsl:template match="/"> 
    <xsl:variable name="vPass1"> 
    <xsl:apply-templates/> 
    </xsl:variable> 

    <xsl:apply-templates select="$vPass1/node()" mode="pass2"/> 
</xsl:template> 

<xsl:template match="instance" mode="pass2"> 
    <instance> 
    <xsl:apply-templates mode="pass2"/> 
    <data>2</data> 
    <data>3</data> 
    </instance> 
</xsl:template> 

<xsl:template match="model" mode="pass2"> 
    <model> 
    <xsl:apply-templates mode="pass2"/> 
    <bind>1</bind> 
    <bind>2</bind> 
    <bind>3</bind> 
    </model> 
</xsl:template> 
</xsl:stylesheet> 

그것은 아이덴티티 규칙을 사용하여 자신을 변환하고이 첫 번째 패스의 결과는 변수에 캡처됩니다.. 그런 다음 두 번째 패스는 $vPass1의 현재 결과를 처리하고 instance 요소 아래에 두 개의 새로운 data 아이들과 model 요소 아래 세 bind 자녀를 추가 - 그래서 최종 결과는 다음과 같습니다

<xform> 
    <xforms> 
     <model> 
     <instance> 
      <data/> 
      <data>2</data> 
      <data>3</data> 
     </instance> 
     <bind>1</bind> 
     <bind>2</bind> 
     <bind>3</bind> 
     </model> 
     <bind/> 
     <bind/> 
     <bind/> 
    </xforms> 
</xform> 
+0

내가 추가 요소에 추가 된 것을 볼, 나는 그들이 당신의 예에서, 그래서 나는 6 개 새로운 요소를 가질 것, 다른 요소 옆에 추가해야 할 것입니다.또한 위의 xml은 출력되는 내용입니다. 입력 된 문서가 아닙니다.이 대답을 제안했을 때 여러분이 가정을했다고 생각합니다 - 아니요? –

+0

@Kata : 아니요, XML 문서를 생성하기 위해 무언가를 처리하고 있습니다.이 "무언가"는 같은 문서가됩니다. 원본 원본 XML 문서가 없어도 변환을 수행하지 않습니다. 출력은 다음과 같은 결과입니다. 첫 번째 패스에서 항등 변환. 다른 추가 사항에 대한 귀하의 희망은 -이 모든 것이 당신 스스로 할 수 있습니다. 나는 두 가지 패스로 문서를 처리하는 방법을 보여 주었고 원하는 모든 노드에서 첫 번째 패스의 결과에 추가하는 방법을 보여주었습니다. –

+0

네 말이 맞아, 나는 이걸로 일할 것이고 너는 어떻게되는지 알려줄거야. 고맙습니다. 도움에 감사드립니다. –

관련 문제