我在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/>
请帮忙。感谢任何帮助,因为我在测试代码时没有测试用例。
答案 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()[.='*']"/>
这比必须计算每个元素的字符串值更有效,因为元素的字符串值是所有其后代文本节点的串联。