从XML文档中删除元素,XSLT和JAXB

4
这个问题是我之前的一个问题的后续: 创建一个使用<all>和<any>元素开放的有效XSD 假设我有一个Java字符串,其中包含以下形式的XML文档:
<TRADE>
  <TIME>12:12</TIME>
  <MJELLO>12345</MJELLO>
  <OPTIONAL>12:12</OPTIONAL>
  <DATE>25-10-2011</DATE>
  <HELLO>hello should be ignored</HELLO>
</TRADE>

如何使用XSLT或类似技术(在Java中使用JAXB)来删除不包含在一组元素中的所有元素。
在上面的例子中,我只对(TIME,OPTIONAL,DATE)感兴趣,因此我希望将其转换为:
<TRADE>
  <TIME>12:12</TIME>
  <OPTIONAL>12:12</OPTIONAL>
  <DATE>25-10-2011</DATE>
</TRADE>

元素的顺序是不固定的。

好问题,+1。请查看我的答案,其中包含完整、简短、易懂的XSLT解决方案和详细的解释。 :) - Dimitre Novatchev
3个回答

6

这个转换:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:param name="pNames" select="'|TIME|OPTIONAL|DATE|'"/>
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*" name="identity">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="*/*">
  <xsl:if test="contains($pNames, concat('|', name(), '|'))">
   <xsl:call-template name="identity"/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

当应用于提供的XML文档时:

<TRADE>
    <TIME>12:12</TIME>
    <MJELLO>12345</MJELLO>
    <OPTIONAL>12:12</OPTIONAL>
    <DATE>25-10-2011</DATE>
    <HELLO>hello should be ignored</HELLO>
</TRADE>

产生所需的、正确的结果:

<TRADE>
   <TIME>12:12</TIME>
   <OPTIONAL>12:12</OPTIONAL>
   <DATE>25-10-2011</DATE>
</TRADE>

说明:

  1. 身份规则(模板)会完整复制每个节点

  2. 当模板匹配到非顶级元素时,该身份规则就会被覆盖。在模板内部,会检查匹配元素的名称是否为外部参数$pNames中所指定的一组名称,这些名称以管道符分隔。

  3. 请查阅您的XSLT处理器文档以了解如何传递参数给转换程序--这取决于实现方式和处理器之间存在差异。


+1,然后您可以使用此XSLT将XML转换为JAXBResult,以解组转换后的XML:https://dev59.com/questions/_1TTa4cB1Zd3GeqPwdwR#5181565 - bdoughan

1

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接