使用Java从xslt中删除所有xsl:if标记

时间:2017-06-18 15:43:46

标签: java xslt

我有什么办法可以从xslt中删除所有xsl:if个标签吗?

我有一个xslt,我想从中检索所有标签名称。我没有访问输入这个xsl的输入xml所以我已经创建了虚拟xml并在其上应用了xsl来生成output.xml,并且从该output.xml我正在检索所有节点的名称。但问题是在xsl中有if条件来检查特定值是否为null,然后只将该标记写入输出xml。那么有没有办法从xslt中删除所有xsl:if标签?

dummy xml:

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

xsl代码:

 <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">


<xsl:strip-space elements="*" />

<xsl:template match="/map">

<xsl:attribute name="xsi:noNamespaceSchemaLocation">
<xsl:text>Test</xsl:text>
</xsl:attribute>
<xsl:if test="@TRANSACTIONDATETIME != ''">
<xsl:element name="TransactionDateTime">
<xsl:value-of select="@TRANSACTIONDATETIME"/>
</xsl:element>
</xsl:if>
<xsl:if test="@CHANGEINDICATOR != ''">
<xsl:element name="ChangeIndicator">
<xsl:value-of select="@CHANGEINDICATOR"/>
</xsl:element>
</xsl:if>

</xsl:template>    

</xsl:stylesheet>

否,当我将此xsl应用于我的虚拟xml输出时,xml不包含带有if条件的标记。

所以我想从xslt中删除所有if条件,这样我就可以生成我想要的xml。

我想要的预期输出是xslt,没有xsl:if标签:

 <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0">


<xsl:strip-space elements="*" />

<xsl:template match="/map">

<xsl:attribute name="xsi:noNamespaceSchemaLocation">
<xsl:text>Test</xsl:text>
</xsl:attribute>
<xsl:element name="TransactionDateTime">
<xsl:value-of select="@TRANSACTIONDATETIME"/>
</xsl:element>
<xsl:element name="ChangeIndicator">
<xsl:value-of select="@CHANGEINDICATOR"/>
</xsl:element>

</xsl:template>    

</xsl:stylesheet>

注意:我无法修改虚拟xml以包含事务日期和更改指示符的值,因为我想要执行此操作的数千个xslt。

1 个答案:

答案 0 :(得分:1)

您可以使用小型XSLT:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- Identity template, copies everything -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- Special template for xsl:if, only copies content -->
  <xsl:template match="xsl:if">
    <xsl:apply-templates select="node()"/>
  </xsl:template>

</xsl:stylesheet>