XML 변환을 사용하여 XML을 다른 XML로 변환하는 방법을 설명합니다. 일부 영어 문자가 변환되지 않았습니다.변형 된 XML
원본 XML :
<?xml version="1.0" encoding="UTF-8"?>
<RR_KeyPersonExpanded_2_0:RR_KeyPersonExpanded_2_0 xmlns:RR_KeyPersonExpanded_2_0="http://apply.grants.gov/forms/RR_KeyPersonExpanded_2_0-V2.0" xmlns:att="http://apply.grants.gov/system/Attachments-V1.0" xmlns:glob="http://apply.grants.gov/system/Global-V1.0" xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V2.0" RR_KeyPersonExpanded_2_0:FormVersion="2.0">
<RR_KeyPersonExpanded_2_0:KeyPerson>
<RR_KeyPersonExpanded_2_0:Profile>
<RR_KeyPersonExpanded_2_0:Name>
<globLib:PrefixName>候.</globLib:PrefixName>
<globLib:FirstName>Lakshmi</globLib:FirstName>
<globLib:MiddleName>AB</globLib:MiddleName>
<globLib:LastName>Sørensen</globLib:LastName>
</RR_KeyPersonExpanded_2_0:Name>
</RR_KeyPersonExpanded_2_0:Profile>
</RR_KeyPersonExpanded_2_0:KeyPerson>
</RR_KeyPersonExpanded_2_0:RR_KeyPersonExpanded_2_0>
removeemptytags.xsl :
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes" encoding="UTF-8" method="xml"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(descendant-or-self::*[text()[normalize-space()] | @*])]"/>
</xsl:stylesheet>
자바 코드 :
public String removeEmptyTags(String xml) {
String filteredXML = "";
try (OutputStream bos = new ByteArrayOutputStream();) {
TransformerFactory transformerFactory = TransformerFactory.newInstance();
StreamSource inputXMLSource = new StreamSource(new ByteArrayInputStream(xml.getBytes("UTF-8")));
StreamSource xsltSource = new StreamSource(getClass().getClassLoader().getResourceAsStream("removeemptytags.xsl"));
Transformer transformer = transformerFactory.newTransformer(xsltSource);
StreamResult result = new StreamResult(bos);
transformer.transform(inputXMLSource, result);
bos.flush();
filteredXML = bos.toString();
} catch (Exception e) {
logger.log(Level.SEVERE, "Exception while removing empty tags : ", e);
throw new ParsingException(e.getMessage());
}
return filteredXML;
}
OUPUT의 XML :
<RR_KeyPersonExpanded_2_0:RR_KeyPersonExpanded_2_0 xmlns:RR_KeyPersonExpanded_2_0="http://apply.grants.gov/forms/RR_KeyPersonExpanded_2_0-V2.0" xmlns:att="http://apply.grants.gov/system/Attachments-V1.0" xmlns:glob="http://apply.grants.gov/system/Global-V1.0" xmlns:globLib="http://apply.grants.gov/system/GlobalLibrary-V2.0" RR_KeyPersonExpanded_2_0:FormVersion="2.0">
<RR_KeyPersonExpanded_2_0:KeyPerson>
<RR_KeyPersonExpanded_2_0:Profile>
<RR_KeyPersonExpanded_2_0:Name>
<globLib:PrefixName>候.</globLib:PrefixName>
<globLib:FirstName>Lakshmi</globLib:FirstName>
<globLib:MiddleName>AB</globLib:MiddleName>
<globLib:LastName>Sørensen</globLib:LastName>
</RR_KeyPersonExpanded_2_0:Name>
</RR_KeyPersonExpanded_2_0:Profile>
</RR_KeyPersonExpanded_2_0:KeyPerson>
</RR_KeyPersonExpanded_2_0:RR_KeyPersonExpanded_2_0>
"영어 이외의 단어"가 방금 헛소리의 무리가된다는 것을 알 수 있습니다. xslt에서 "UTF-16"으로 인코딩을 변경하려고 시도하지만 작동하지 않습니다. 누구도 여기에서 같은 문제가 발생합니까?
당신이 UTF-8로 출력의 인코딩을 설정 했습니까? – Compass