XSLT不替换树中的空节点

时间:2016-05-13 13:39:50

标签: xml xslt

我正在开发一个XSLT,用于为我的一些空节点添加值。如果节点在一个或两个父节点内,则可以工作,例如

<?xml version="1.0" encoding="UTF-8"?>

      <VehicleDataCustom>
         <VehicleDataCustomHeader>
            <Commessa>SSP100</Commessa>
            <RecordType />
            <AttivitaAnnullamento />
         </VehicleDataCustomHeader>
      </VehicleDataCustom>

这是我的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="AttivitaAnnullamento[not(node())]">
        <xsl:copy>yes</xsl:copy>
    </xsl:template>
</xsl:stylesheet>

它在我生成的XML中清楚地给出了如下的结果 -

<?xml version="1.0" encoding="UTF-8"?><VehicleDataCustom>
         <VehicleDataCustomHeader>
            <Commessa>SSP100</Commessa>
            <RecordType/>
            <AttivitaAnnullamento>yes</AttivitaAnnullamento>
         </VehicleDataCustomHeader>
      </VehicleDataCustom>

但是如果我的XML具有以下结构,它什么都不做 -

<?xml version="1.0" encoding="UTF-8"?>
<ProcessVehicleDataCustom xmlns="http://schema.test.com/Testing/2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schema.test.com/2.2.0/Testing http://schema.test.com/2.2.0/Testing/BODs/Developer/ProcessVehicleDataCustom.xsd" releaseID="2">
      <VehicleDataCustom>
         <VehicleDataCustomHeader>
            <Commessa>SSP100</Commessa>
            <RecordType />
            <AttivitaAnnullamento />
         </VehicleDataCustomHeader>
      </VehicleDataCustom>
</ProcessVehicleDataCustom>

不确定此格式有什么问题。有没有办法处理这个标签?我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

<强>解决 -

我能够通过使用以下XSLT来完成它 -

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:met="http://schema.test.com/Testing/2"
exclude-result-prefixes="met">
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
<xsl:template match="met:VehicleDataCustom/met:VehicleDataCustomHeader/met:AttivitaAnnullamento[not(node())]">
        <xsl:copy>attiv</xsl:copy>
    </xsl:template>
</xsl:stylesheet>

希望能有所帮助。