簡體   English   中英

從XML文檔,XSLT和JAXB中刪除元素

[英]Removing elements from an XML document, XSLT and JAXB

這個問題是我之前提出的問題的后續問題: 創建一個使用<all>和<any>元素打開的有效XSD

鑒於我有一個包含以下形式的XML文檔的Java String:

<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>

元素的順序不固定。

這種轉變:

<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名稱字符串中的外部參數$pNames中指定的名稱之一。

  3. 有關如何將參數傳遞給轉換的信息,請參閱XSLT處理器的文檔 - 這與實現有關,因處理器而異。

我還沒有嘗試過,但也許javax.xml.tranform包可以幫助:

http://download.oracle.com/javase/6/docs/api/javax/xml/transform/package-summary.html

JAXB和XSLT

JAXB非常干凈地與XSLT集成,例如:

你的其他問題

根據您之前的問題(請參閱下面的鏈接),轉換實際上是不必要的,因為JAXB將忽略未映射到域對象中的字段/屬性的屬性和元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM