这是我需要使用XSLT转换的XML源
<?xml version="1.0" encoding="UTF-8"?>
<tns:Grand_Parent_XML xmlns:tns="">
<GrandParent>
<Parent>
<Child>
<Age>3</Age>
</Child>
<Child>
<Gender>Male</Gender>
</Child>
<Child>
<Name>Todd</Name>
</Child>
<Other>1234</Other>
</Parent>
</GrandParent>
</tns:Grand_Parent_XML>
这是通过XSLT转换后的所需输出
<?xml version="1.0" encoding="UTF-8"?>
<tns:Grand_Parent_XML xmlns:tns="">
<GrandParent>
<Parent>
<Child>
<Age>3</Age>
<Gender>Male</Gender>
<Name>Todd</Name>
</Child>
<Other>1234</Other>
</Parent>
</GrandParent>
</tns:Grand_Parent_XML>
以下是实际发生的事情......
<?xml version="1.0" encoding="UTF-8"?>
<tns:Grand_Parent_XML xmlns:tns="">
<GrandParent>
<Child>
<Age>3</Age>
<Gender>Male</Gender>
<Name>Todd</Name>
</Child>
</GrandParent>
</tns:Grand_Parent_XML>
我正在使用这个XSLT ......
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="">
<xsl:template match="Grand_Parent_XML/GrandParent/Parent">
<Child>
<xsl:for-each select="Child">
<xsl:if test="Age !=''">
<Age><xsl:value-of select="Age"/></Age>
</xsl:if>
<xsl:if test="Gender !=''">
<Gender><xsl:value-of select="Gender"/></Gender>
</xsl:if>
<xsl:if test="Name !=''">
<Name><xsl:value-of select="Nanme"/></Name>
</xsl:if>
</xsl:for-each>
</Child>
</xsl:template>
</xsl:stylesheet>
我目前对XSLT的掌握很少,我很感激能得到的任何帮助。使用我创建的XSLT,父级被Child重写,而不应该是这种情况。此外,删除了Parent,Other的其他子节点。我使用的实际XML字段比我在此处包含的字段多得多。我可以选择手动包含XSLT中的所有节点,但我觉得这是一种更有效的方法。谢谢!
答案 0 :(得分:1)
这是一种适用于各种不同输入的通用方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:key name="kNamedSiblings" match="*"
use="concat(generate-id(..), '+', name())"/>
<xsl:template match="*">
<xsl:copy>
<xsl:apply-templates select="key('kNamedSiblings',
concat(generate-id(..), '+', name())
)/node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(*) and . = '']" />
<xsl:template match="*[generate-id() !=
generate-id(key('kNamedSiblings',
concat(generate-id(..), '+', name()))[1]
)]" />
</xsl:stylesheet>
在样本输入上运行时,结果为:
<tns:Grand_Parent_XML xmlns:tns="...">
<GrandParent>
<Parent>
<Child>
<Age>3</Age>
<Gender>Male</Gender>
<Name>Todd</Name>
</Child>
<Other>1234</Other>
</Parent>
</GrandParent>
</tns:Grand_Parent_XML>
答案 1 :(得分:0)
以这种方式尝试:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Parent">
<xsl:copy>
<Child>
<xsl:apply-templates select="Child/*"/>
</Child>
<xsl:apply-templates select="*[not(self::Child)]"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
或者,如果您愿意:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Parent">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Child>
<xsl:apply-templates select="Child/*"/>
</Child>
</xsl:copy>
</xsl:template>
<xsl:template match="Child"/>
</xsl:stylesheet>