如何使用Java

时间:2016-03-21 12:59:57

标签: java xml

我需要修改XML,我有一个父标记部分,其中包含子标记部分和子标记子子标记,它们是项目, 品牌,制造商,型号,成本。它有一个品牌标记,它包含名为品牌的标记名称。我需要改变品牌属性 (标识符)值。如果品牌子标记包含(textcontent)文本(Geforce_GT)等于部分标记中的文字:品牌子标记:文字 (Geforce_GT)即可。然后品牌标记在部分代码中的 Id属性值应分配给品牌标签子品牌Brands Parent标签中的 Identifeir属性

<?xml version="1.0" ?>
<!DOCTYPE PARTS SYSTEM "parts.dtd">
<?xml-stylesheet type="text/css" href="xmlpartsstyle.css" ?>
<PARTS>
  <TITLE>Computer Parts</TITLE>
  <PART>
    <ITEM id="CP1809_E1">Motherboard</ITEM>
    <MANUFACTURER>ASUS</MANUFACTURER>
    <MODEL>P3B-F</MODEL>
    <COST>123.00</COST>
  </PART>
  <PART>
    <ITEM id="CP1809_E2">Video Card</ITEM>
    <BRAND id="CP1809_B1">Geforce_GT</BRAND>
    <MANUFACTURER>ATI</MANUFACTURER>
    <MODEL>All-in-Wonder Pro</MODEL>
    <BRAND id="CP1809_B2">730_64-BIT</BRAND>
    <COST>160.00</COST>
  </PART>
  <PART>
    <ITEM id="CP1809_E3">Sound Card</ITEM>
    <MANUFACTURER>Creative Labs</MANUFACTURER>
    <MODEL>Sound Blaster Live</MODEL>
    <COST>80.00</COST>
  </PART>
  <PART>
    <ITEM id="CP1809_E3">inch Monitor</ITEM>
    <MANUFACTURER>LG Electronics</MANUFACTURER>
    <MODEL>995E</MODEL>
    <COST>290.00</COST>
  </PART>
  <BRANDS>
    <BRAND identifier="CP1809_E2">
      <TEXTCONTENT>Geforce_GT</TEXTCONTENT>
    </BRAND>
    <BRAND identifier="CP1809_E2">
      <TEXTOVERVIEW>730_64-BIT</TEXTOVERVIEW>
    </BRAND>
    <BRAND identifier="B1809_E3">
      <TEXT>Empty</TEXT>
    </BRAND>
    <BRAND identifier="B1809_E4">
      <TEXT>Empty</TEXT>
    </BRAND>
  </BRANDS>
</PARTS>

我需要进行修改,例如:

<BRANDS>
  <BRAND identifier = "CP1809_B1">
    <TEXTCONTENT>Geforce_GT<TEXTCONTENT>
  </BRAND>
  <BRAND identifier = "CP1809_B2">
    <TEXTCONTENT>730_64-BIT<TEXTCONTENT>
  </BRAND>
  <!-- ... -->
<BRANDS>

1 个答案:

答案 0 :(得分:1)

XSLT可以做到这一点(参见http://xsltransform.net/ej9EGda示例):

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

    <xsl:key name="desc" match="PART/BRAND" use="."/>

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

    <xsl:template match="BRANDS/BRAND[key('desc', TEXTCONTENT)]/@identifier">
        <xsl:attribute name="{name()}">
            <xsl:value-of select="key('desc', ../TEXTCONTENT)/@id"/>
        </xsl:attribute>
    </xsl:template>

</xsl:transform>

在Java平台上,您可以选择XSLT处理器,例如用于XSLT 2.0的Saxon 9或用于XSLT 1.0的Xalan或Saxon 6以及JRE中的Xalan的内置版本。