java - 如何使用 xslt 将父节点命名空间复制到子元素?
问题描述
我的 xml 看起来像我使用 Java JAXBContext 和 Marshaller 创建的。我想格式化 xml 的某些部分,而不是整个 xml。
<?xml version="1.0" encoding="UTF-8"?>
<ns4:Requests xmlns:ns2="http://www.dummy.com/xsd/tublu/murmur_001" xmlns:ns3="http://www.dummy.com/xsd/CommonObjects_001" xmlns:ns4="http://www.dummy.com/xsd/naku_001">
<ns4:RequestSetId>fhskgvseruigiu</ns4:RequestSetId>
<ns4:RequestStream>CHAPP</ns4:RequestStream>
<ns4:Request>
<ns4:TrackAndTrace>
<ns4:CPAId>003</ns4:CPAId>
<ns4:CorrelationId>ytuty</ns4:CorrelationId>
</ns4:TrackAndTrace>
</ns4:Request>
<ns4:Request>
<ns4:TrackAndTrace>
<ns4:CPAId>003</ns4:CPAId>
<ns4:CorrelationId>cyuri7</ns4:CorrelationId>
</ns4:TrackAndTrace>
</ns4:Request>
</ns4:Requests>
我想格式化
<?xml version="1.0" encoding="UTF-8"?>
<ns4:Requests xmlns:ns2="http://www.dummy.com/xsd/tublu/murmur_001" xmlns:ns4="http://www.dummy.com/xsd/naku_001" xmlns:ns3="http://www.dummy.com/xsd/CommonObjects_001">
<ns4:RequestSetId>fhskgvseruigiu</ns4:RequestSetId>
<ns4:RequestStream>CHAPP</ns4:RequestStream>
<ns4:Request xmlns:ns4="http://www.dummy.com/xsd/naku_001"><ns4:TrackAndTrace><ns4:CPAId>003</ns4:CPAId><ns4:CorrelationId>ytuty</ns4:CorrelationId></ns4:TrackAndTrace></ns4:Request>
<ns4:Request xmlns:ns4="http://www.dummy.com/xsd/naku_001"><ns4:TrackAndTrace><ns4:CPAId>003</ns4:CPAId><ns4:CorrelationId>cyuri7</ns4:CorrelationId></ns4:TrackAndTrace></ns4:Request>
</ns4:Requests>
解决方案
这是解决方案(通过使用 Java 的 XSLT API 转换 XML 数据),
您可能也注意到了.. 单独的 JAXB 无法满足此要求,但是在将对象编组为格式化的 XML 字符串(如您所示)之后,您可以使用合适的 XSLT 文件相应地对其进行处理/转换
因此,要获得线性化的“请求”元素,只需使用如下所示的 xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="TrackAndTrace"/>
<xsl:strip-space elements="Request"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
注意:还测试了上述方法/方法是否正常工作 - 使用了 Stylizer 示例代码(来自https://docs.oracle.com/javase/tutorial/jaxp/xslt/transformingXML.html)
干杯!
更新:如果您想要一个还保留原始名称空间前缀的解决方案,如您的问题所示,请遵循此变体 Add factory.setNamespaceAware(true); 在 Stylizer 代码中 & 使用这个经过调整的 XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform" xmlns:ns4="dummy.com/xsd/naku_001">
<xsl:strip-space elements="ns4:TrackAndTrace"/>
<xsl:strip-space elements="ns4:Request"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
推荐阅读
- qt - 如何在 QML 中记录 javascript 可访问的 Qt 对象?
- asp.net - .net核心应用程序套接字在负载下泄漏
- excel - 如何在 For Each 循环语句中跳过范围内的第一个元素?
- python - Python - 对数据框中元素的出现次数进行编号
- javascript - 如何为 reactJs 中的 textBox 中的每个输入值生成一个数组
- java - 如何在应用程序加载时间加载@FeignClient
- .net - 如何强制更改 AccesibilityObject 的状态
- python - 乍一看非常简单的功能!请在下面找到关于 pyschools 字符串的问题。为什么我的函数没有删除所有字母?
- python - 删除 HoughLinesP 检测到的行
- html - 替代 iframe 中的伪元素