![](/img/trans.png)
[英]Merge 2 XML files (including node attributes) based on attribute values using XSLT
[英]merge parent and child attributes using xslt based on attribute values
我有一个包含以下标记的xml文件,我知道此文件的格式不正确,但这就是文件的格式。
<?xml version="1.0" encoding="UTF-8"?>
<mbean code="org.book.mybooks"
name="mycompany.props.jndi:name=mybookprops">
<attribute name="CombineProps" serialDataType="jbxb">
<jndi:bindings xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">
<jndi:binding name="books/mybooks/cartoon/comics">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="abc/ebooks/onebook/action">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="abc/ibooks/twobook/romance">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
</jndi:bindings>
</attribute>
<mbean code="org.book.mybooks"
name="mycompany.props.jndi:name=mybookprops">
<attribute name="CombineProps" serialDataType="jbxb">
<jndi:bindings xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">
<jndi:binding name="books/mybooks/cartoon/comics">
<jndi:value type="java.lang.String">
@New_Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="abc/ebooks/onebook/action">
<jndi:value type="java.lang.String">
@New_Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="books/new/books/cartoon">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
</jndi:bindings>
</attribute>
</mbean>
</mbean>
如果您观察到该文件,它在父元素<mbean>
包含一个名为<mbean>
的子元素,因此我想删除该父子元素,并制作一个单个元素<mbean>all parent elements and child elements</mbean>
文件。
我在stackoverflow中搜索了几个问题,但看起来它们与我现在遇到的问题并不完全相关。 有人可以通过xslt 1.0或2.0给出如何使用此解决方案的想法。
这是我期望的最终输出:
<?xml version="1.0" encoding="UTF-8"?>
<mbean code="org.book.mybooks"
name="mycompany.props.jndi:name=mybookprops">
<attribute name="CombineProps" serialDataType="jbxb">
<jndi:bindings xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">
<jndi:binding name="books/mybooks/cartoon/comics">
<jndi:value type="java.lang.String">
@New_Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="abc/ebooks/onebook/action">
<jndi:value type="java.lang.String">
@New_Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="abc/ibooks/twobook/romance">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
<jndi:binding name="books/new/books/cartoon">
<jndi:value type="java.lang.String">
@Value@
</jndi:value>
</jndi:binding>
</jndi:bindings>
</attribute>
</mbean>
如我在上一个答案中所述,只需更改XPATH。 希望您能为您服务。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jndi="urn:jboss:jndi-binding-service:1.0" >
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes" />
<xsl:template match="mbean/mbean">
<mbean code="org.book.mybooks"
name="mycompany.props.jndi:name=mybookprops">
<attribute name="CombineProps" serialDataType="jbxb">
<jndi:bindings xmlns:jndi="urn:jboss:jndi-binding-service:1.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
xs:schemaLocation="urn:jboss:jndi-binding-service:1.0 resource:jndi-binding-service_1_0.xsd">
<xsl:copy-of select="attribute/jndi:bindings/jndi:binding"/>
<xsl:call-template name="Mbean">
<xsl:with-param name="bindings" select="attribute/jndi:bindings/jndi:binding"/>
</xsl:call-template>
</jndi:bindings>
</attribute>
</mbean>
</xsl:template>
<xsl:template name="Mbean">
<xsl:param name="bindings"/>
<xsl:for-each select="/mbean/attribute/jndi:bindings/jndi:binding">
<xsl:variable name="currentBinding" select="self::node()"/>
<xsl:if test="not(@name[. = $bindings/@name])">
<xsl:copy-of select="self::node()"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
<xsl:template match="text()"></xsl:template>
</xsl:stylesheet>
您可以更改路径。 首先写父节点,然后写没有爸爸的孩子。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:jndi="urn:jboss:jndi-binding-service:1.0">
<!--Put missing nodes as mbean-->
<xsl:template match="mbean">
<xsl:copy-of select="attribute/jndi:bindings/jndi:binding"/>
<xsl:call-template name="childMbean">
<xsl:with-param name="bindings" select="attribute/jndi:bindings/jndi:binding"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="childMbean">
<xsl:param name="bindings"/>
<xsl:for-each select="mbean/attribute/jndi:bindings/jndi:binding">
<xsl:variable name="currentBinding" select="self::node()"/>
<xsl:if test="not(@name[. = $bindings/@name])">
<xsl:copy-of select="self::node()"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.