XSLT匹配所有节点&忽略特定节点

时间:2017-12-19 22:02:36

标签: templates xslt

我有一个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>

1 个答案:

答案 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>