xslt help - 删除空标签并用空标签替换*

时间:2010-06-21 19:28:43

标签: java xslt jaxb xslt-2.0 jaxb2

我在java程序中进行一些XSLT预处理时遇到问题。 我们从大型机程序中获取一个星号(*),当它想要删除一个值时,我的java进程必须将其视为空白或空标记。所以我们在jaxb进程之前将xslt应用于输入。

我们正在应用这个xslt:

  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="no"/>
  <xsl:template match="@*[. = '*']">
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
      <xsl:text></xsl:text>
    </xsl:attribute>
  </xsl:template>
  <xsl:template match="*[. = '*']">
    <xsl:copy>
      <xsl:text></xsl:text>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

以上xslt适用于ALMOST所有测试用例。 除了只有一个子元素且恰好是星号的情况。

例如在输入中考虑这个:

<MYROOT><Address3><Line2>*</Line2><Line3>*</Line3></Address3></MYROOT>

运作良好。 它产生这个输出:

<MYROOT><Address3><Line2/><Line3/></Address3></MYROOT>

然而,下面的xml输入会产生错误的响应。

<MYROOT><Address4><PermanentAddress><Line2>*</Line2></PermanentAddress></Address4></MYROOT>

但不是将回复作为

<MYROOT><Address4><PermanentAddress><Line2></Line2></PermanentAddress></Address4></MYROOT>

它给出了这个:

<MYROOT/>

请帮忙。感谢任何帮助,因为我在测试代码时没有测试用例。

2 个答案:

答案 0 :(得分:1)

那是因为.是内部文本,它是所有内部文本节点的串联。您需要确保在您的情况下没有子节点或仅有*作为内容的文本节点。

这应该有效:

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

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

    <xsl:template match="*[not(*) and (. = '*')] | @*[. = '*']">
        <xsl:copy />
    </xsl:template>
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

<强>替换

<xsl:template match="*[. = '*']"> 
    <xsl:copy> 
      <xsl:text></xsl:text> 
    </xsl:copy> 
  </xsl:template>

<强>与

  <xsl:template match="*[not(*) and not(text()[2])]/text()[.='*']"/>

这比必须计算每个元素的字符串值更有效,因为元素的字符串值是所有其后代文本节点的串联。