2017-12-19 4 views
0

Ich habe eine XSLT und ich wollte alle Elemente unter einem bestimmten Knoten mit Ausnahme eines bestimmten Knotens kopieren. Der Grund, warum ich diesen Knoten ignoriere, ist, ich muss überprüfen, ob der Knoten in xml & existiert, wenn es nicht dann muss ich einen Standardwert festlegen. Hier ist der Code snipette ich habe & es scheint nichtXSLT passen alle Knoten an und Ignore einen bestimmten Knoten

Ich habe einige andere Vorlagen in XSLT zu arbeiten & i-Modus enthalten, so kann ich dies speziell verwenden für einen bestimmten Knoten

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

Hier ist die Knoten & die Logik

<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

Bitte fügen Sie Ihrer Frage XML-Eingabe hinzu. –

Antwort

0

Es ist wahrscheinlich „nicht funktioniert“, weil Sie keine xsl:choose als Kind von xsl:apply-templates haben kann.

Wenn Ihre Logik ist, dass Sie den DriversLicense Knoten kopiert werden soll, wenn es vorhanden ist, aber einen Standardwert hinzufügen, wenn es nicht der Fall, dann können Sie durch Vorlage erreichen Vehicle Knoten, die keine passende DriversLicense Knoten haben.

Um dies zu tun, anstatt <xsl:for-each select="Vehicle"> zu tun, ersetzen Sie den gesamten Block mit einem xsl:apply-templates statt ...

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

Dann eine Vorlage hinzufügen, die Vehicle Knoten ohne DriversLicense Knoten übereinstimmt, dass der Knoten kopiert und fügt ein Standard

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

Dies vorausgesetzt, dass Sie auch die Identität Vorlage als auch in Ihrem XSLT verwenden

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