2017-12-19 6 views
0

XSLT가 있는데 특정 노드를 제외하고 특정 노드 아래의 모든 요소를 ​​복사하려고합니다. 내가이 노드를 무시하는 이유는 노드가 xml에 존재하는지 확인해야하기 때문이며, 기본값이 아닌 경우 &입니다. 여기에 코드 snipette는XSLT가 모든 노드와 일치하고 특정 노드를 무시합니다.

나는 그래서 내가 특별히 여기

<xsl:template match="*" mode="copyexcludingDL"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()[not(self::DriversLicense)]"/> 
    </xsl:copy> 
</xsl:template> 

이있는 특정 노드에 대해이 작업을 사용할 수있는 모드를 포함 XSLT &에 몇 가지 다른 템플릿이 작동하지 않는 것 내가 &을 한 것입니다 노드 & 논리

<xsl:for-each select="Vehicle"> 
    <xsl:apply-templates mode="copyexcludingDL" select="."> 
    <xsl:choose> 
     <xsl:when test="DriversLicense"> 
      <xsl:apply-templates mode="copy" select="DriversLicense" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:element name="DriversLicense"> 
       <xsl:text>None</xsl:text> 
      </xsl:element> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:apply-templates> 
</xsl:for-each> 
+0

입력 XML을 질문에 추가하십시오. –

답변

0

당신이 xsl:apply-templates의 자녀로서 xsl:choose을 할 수 없기 때문에 그것은 아마 "작동하지 않는"입니다.

논리는 당신이 존재하는 경우 DriversLicense 노드를 복사 싶어하지만, 당신은 더 DriversLicense 노드가없는 Vehicle 노드와 일치하는 템플릿에 의해 달성 할 수없는 경우 디폴트 값을 추가하는 것이됩니다.

<xsl:apply-templates select="Vehicle" /> 

는 그런 다음 DriversLicense 노드없이 Vehicle 노드와 일치하는 템플릿을 추가, 복사하는 노드와 추가 ... 대신 <xsl:for-each select="Vehicle"> 일을 이렇게 대신 xsl:apply-templates와 전체 블록을 교체하려면 이것은 당신이 또한 당신의 XSLT에서뿐만 아니라 정체성 템플릿을 사용하는 가정 기본

<xsl:template match="Vehicle[not(DriversLicense)]"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <DriversLicense>None</DriversLicense> 
    </xsl:copy> 
</xsl:template> 

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