我有一个XSLT,我想复制特定节点下的所有元素,但一个特定节点除外。我忽略这个节点的原因是,我需要检查xml&中是否存在节点。如果没有,那么我需要设置默认值。这是我有的代码snipette&它似乎不起作用
我在XSLT&中有几个其他模板。我包含模式,所以我可以专门用于特定节点
<xsl:template match="*" mode="copyexcludingDL">
<xsl:copy>
<xsl:apply-templates select="@*|node()[not(self::DriversLicense)]"/>
</xsl:copy>
</xsl:template>
这是Node&amp;逻辑
<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 :(得分:0)
可能“无法正常工作”,因为您xsl:choose
的孩子不能xsl:apply-templates
。
如果您的逻辑是要复制DriversLicense
节点(如果存在),但如果不存在则添加默认值,那么您可以通过模板匹配Vehicle
节点来实现{1}}节点。
要执行此操作,请使用DriversLicense
替换整个块而不是<xsl:for-each select="Vehicle">
...
xsl:apply-templates
然后添加一个匹配 <xsl:apply-templates select="Vehicle" />
个节点而没有Vehicle
节点的模板,该节点复制节点并添加默认值
DriversLicense
这假设您也在XSLT中使用身份模板
<xsl:template match="Vehicle[not(DriversLicense)]">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<DriversLicense>None</DriversLicense>
</xsl:copy>
</xsl:template>