0

次の文字列strFees720を返しました

これは次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Fees720>
        <errorNode>
            <errorCode>0</errorCode>
            <errorMsg/>
            <errorSev/>
        </errorNode>
        <forwardScroll>       0093101200001117                0</forwardScroll>
        <backwardScroll>                                        </backwardScroll>
        <Field name="ACCID"><Value>93101200001034</Value></Field>
        <Field name="FPERIOD"><Value>2C</Value></Field>
        <Field name="STDATE"><Value>13 DEC 2012</Value></Field>
        <Field name="ENDATE"><Value>13 DEC 2012</Value></Field>
        <Field name="ADVDATE"><Value>19 DEC 2012</Value></Field>
        <Field name="DBDATE"><Value> F40LA1C   </Value></Field>
        <Field name="SNAME"><Value>N SINGLETON JG</Value></Field>
        <Field name="ACDESC"><Value>OVERDRAFT AAA</Value></Field>
        <Field name="TOTFEES"><Value>0</Value></Field>
        <Field name="DISCOUNT"><Value>0</Value></Field>
        <Field name="NETFEES"><Value>0</Value></Field>
        <Field name="CLRD_BAL"><Value>93101200001034</Value></Field>
        <Field name="ALLOW_RTE"><Value>0</Value></Field>
        <Field name="DISC_RTE"><Value>0</Value></Field>
        <Field name="ALLOW_TOT"><Value>0</Value></Field>
        <Field name="PCODE"><Value>0000000</Value></Field>
        <Field name="DRILLNSC"><Value>0</Value></Field>
        <Field name="DIALOG"><Value>9</Value></Field>
        <Field name="NUMLINES"><Value>1</Value></Field>
        <Field name="TOTLINES"><Value>0</Value></Field>
        <Field name="BPCUST"><Value>P</Value></Field>
        <Field name="NFEE_EXPDTE"><Value></Value></Field>
        <FEEDATA>
            <Field name="FCODE"><Value></Value></Field>
            <Field name="FEEDETS"><Value></Value></Field>
            <Field name="CHRG_TYPE"><Value></Value></Field>
            <Field name="DCODE"><Value></Value></Field>
            <Field name="VOLUME"><Value>0</Value></Field>
            <Field name="RATE"><Value>0</Value></Field>
            <Field name="TOTAL"><Value>0</Value></Field>
            <Field name="DRILL"><Value></Value></Field>
        </FEEDATA>
        <GROSSNETFEES>
            <Field name="FQUARTER"><Value>06 DEC 12    12 DEC 12</Value></Field>
            <Field name="GRSFEE"><Value>611960</Value></Field>
            <Field name="NFEE"><Value>611960</Value></Field>
            <Field name="FEEDISC"><Value>0</Value></Field>
        </GROSSNETFEES>
        <GROSSNETFEES>
            <Field name="FQUARTER"><Value>01 DEC 12    05 DEC 12</Value></Field>
            <Field name="GRSFEE"><Value>64850</Value></Field>
            <Field name="NFEE"><Value>64850</Value></Field>
            <Field name="FEEDISC"><Value>0</Value></Field>
        </GROSSNETFEES>
        <GROSSNETFEES>
            <Field name="FQUARTER"><Value>08 NOV 12    30 NOV 12</Value></Field>
            <Field name="GRSFEE"><Value>15866</Value></Field>
            <Field name="NFEE"><Value>15866</Value></Field>
            <Field name="FEEDISC"><Value>0</Value></Field>
        </GROSSNETFEES>
        <GROSSNETFEES>
            <Field name="FQUARTER"><Value>01 NOV 12    07 NOV 12</Value></Field>
            <Field name="GRSFEE"><Value>636</Value></Field>
            <Field name="NFEE"><Value>616</Value></Field>
            <Field name="FEEDISC"><Value>20</Value></Field>
        </GROSSNETFEES>
        <Field name="TOTGRSFEE"><Value>693312</Value></Field>
        <Field name="TOTNETFEE"><Value>693292</Value></Field>
    </Fees720>
</Response>

このxml文字列の応答を新しいxml文字列に変換したいと思います

次のように:

    <?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Fees720>
        <errorNode>
            <errorCode>0</errorCode>
            <errorMsg/>
            <errorSev/>
        </errorNode>
        <forwardScroll>       0093101200001117                0</forwardScroll>
        <backwardScroll>                                        </backwardScroll>
        <accid>93101200001034</accid>
        <fperiod>2C</fperiod>
        <stdate>13 DEC 2012</stdate>
        <endate>13 DEC 2012</endate>
        <advdate>19 DEC 2012</advdate>
        <dbdate> F40LA1C   </dbdate>
        <sname>N SINGLETON JG</sname>
        <acdesc>OVERDRAFT AAA</acdesc>
        <totfees>0</totfees>
        <discount>0</discount>
        <netfees>0</netfees>
        <clrdbal>93101200001034</clrdbal>
        <allowrte>0</allowrte>
        <discrte>0</discrte>
        <allowtot>0</allowtot>
        <pcode>0000000</pcode>
        <drillnsc>0</drillnsc>
        <dialog>9</dialog>
        <numlines>1</numlines>
        <totlines>0</totlines>
        <bpcust>P</bpcust>
        <nfeeexpdte></nfeeexpdte>
        <feedata>
            <fcode></fcode>
            <feedets></feedets>
            <chrgtype></chrgtype>
            <dcode></dcode>
            <volume>0</volume>
            <rate>0</rate>
            <total>0</total>
            <drill></drill>
        </feedata>
        <grossnetfees>
            <fquarter>06 DEC 12    12 DEC 12</fquarter>
            <grsfee>611960</grsfee>
            <nfee>611960</nfee>
            <feedisc>0</feedisc>
        </grossnetfees>
        <grossnetfees>
            <fquarter>01 DEC 12    05 DEC 12</fquarter>
            <grsfee>64850</grsfee>
            <nfee>64850</nfee>
            <feedisc>0</feedisc>
        </grossnetfees>
        <grossnetfees>
            <fquarter>08 NOV 12    30 NOV 12</fquarter>
            <grsfee>15866</grsfee>
            <nfee>15866</nfee>
            <feedisc>0</feedisc>
        </grossnetfees>
        <grossnetfees>
            <fquarter>01 NOV 12    07 NOV 12</fquarter>
            <grsfee>636</grsfee>
            <nfee>616</nfee>
            <feedisc>20</feedisc>
        </grossnetfees>
        <totgrsfee>693312</totgrsfee>
        <totnetfee>693292</totnetfee>
    </Fees720>
</Response>

私は次のようなことをする必要があると思っています。

strFees720Transform = XSLTransformer.transform("mynewxsl.xsl", strFees720);

元のxmlを新しいxmlに変換します。これを行うための最良の方法に関するアドバイスをお願いします。ありがとう

メソッドで更新

    private String getServiceValue(String strXMLResponse, String strNode, String strService) throws ServletException{

    String strNodeValue = null;

    try{
        builder = new SAXBuilder(false);
        Document doc = builder.build(new InputSource(new StringReader(strXMLResponse)));

        Element root = doc.getRootElement();  
        Element rootchild = root.getChild(strService); 
        List rootchildren = rootchild.getChildren();

        for (int i=0;i <= rootchildren.size() -1;i++)  
        {  
            Element el = (Element) rootchildren.get(i);  

            if(el.getName().equalsIgnoreCase(strNode)){
                strNodeValue = el.getText();
            }
        }  

    } catch (Exception err) {
        logger.error(err.getMessage(), err);
        throw new ServletException(err.getMessage());
    }

    return strNodeValue;
}
4

1 に答える 1

1

「XMLにいくつかの変更を加えたいが、ほとんど同じようにしたい」という質問に対する通常のアドバイスは、IDテンプレート(入力を逐語的に出力にコピーする)から始めて、必要なものに特定のテンプレートを追加することです。変更します。IDテンプレートは次のようになります

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

<Field>次に、元の属性から名前が派生した新しい要素を作成する要素を処理しますField

<xsl:template match="Field">
  <xsl:element name="{translate(@name, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ_', 'abcdefghijklmnopqrstuvwxyz')}">
    <xsl:apply-templates select="Value/node()" />
  </xsl:element>
</xsl:template>

ここでのtranslate関数は、すべての大文字を同等の小文字に置き換え、アンダースコアも完全に削除します。

最後に、FEEDATAそしてGROSSNETFEESあなたはただ2つの簡単なテンプレートが必要です

<xsl:template match="FEEDATA">
  <feedata>
    <xsl:apply-templates select="@*|node()"/>
  </feedata>
</xsl:template>
<!-- and likewise for GROSSNETFEES -->

translate必要に応じて、同じトリックを使用して、これら2つのテンプレートを1つに組み合わせることができます。

変換を行う実際のメカニズムについては、 javax.xml.transformパッケージを確認する必要があります。XML文字列をJDOMツリーに解析して目的の要素を抽出するコードがすでにあるので、そこでXSL変換を実行します。Templates初期化時に単一のインスタンスを作成し、参照をどこかに保存します

TransformerFactory tf = TransformerFactory.newInstance();
Source xslSource = new StreamSource(new File(....));
templates = tf.newTemplates(xslSource);

これで、変換を行う必要があるたびに、これを使用できますtemplates

try{
    builder = new SAXBuilder(false);
    Document doc = builder.build(new InputSource(new StringReader(strXMLResponse)));

    Element root = doc.getRootElement();  
    Element rootchild = root.getChild(strService); 
    List rootchildren = rootchild.getChildren();

    for (int i=0;i <= rootchildren.size() -1;i++)  
    {  
        Element el = (Element) rootchildren.get(i);  

        if(el.getName().equalsIgnoreCase(strNode)){
            // do the transformation
            Source s = new JDOMSource(el);
            StringWriter resultWriter = new StringWriter();
            Result r = new StreamResult(resultWriter);
            templates.newTransformer().transform(s, r);
            return resultWriter.toString();
        }
于 2012-12-17T11:03:07.217 に答える