我有一个XML文档:
<Root>
<ANode>
<FirstSubNode>value1</FirstSubNode>
<SecondSubNode>value2</SecondSubNode>
</ANode>
<ANode>
<FirstSubNode>value3</FirstSubNode>
<SecondSubNode>value4</SecondSubNode>
</ANode>
<ANode>
<FirstSubNode>value5</FirstSubNode>
<SecondSubNode>value6</SecondSubNode>
</ANode> </Root>
现在我想将FirstSubNode移动到另一个新节点:
<Root>
<ANode>
<SecondSubNode>value2</SecondSubNode>
</ANode>
<ANode>
<SecondSubNode>value4</SecondSubNode>
</ANode>
<ANode>
<SecondSubNode>value6</SecondSubNode>
</ANode>
<BNode>
<FirstSubNode>value1</FirstSubNode>
<FirstSubNode>value3</FirstSubNode>
<FirstSubNode>value5</FirstSubNode>
</BNode></Root>
我的XSL文件,duto的一些原因,我必须使用输出“文本”格式。
<xsl:output method="text" version="1.0" encoding="UTF-8"/>
<xsl:template match="*">
<xsl:text><</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:for-each select="@*">
<xsl:text> </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text>></xsl:text>
<xsl:apply-templates select="node()"/>
<xsl:text></</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="/Root">
<xsl:text><Root></xsl:text>
<xsl:apply-templates select="node()"/>
<xsl:if test="ANode">
<xsl:text><BNode></xsl:text>
<xsl:for-each select="ANode">
<xsl:copy>
<xsl:apply-templates select="FirstSubNode"/>
</xsl:copy>
</xsl:for-each>
<xsl:text></BNode></xsl:text>
</xsl:if>
<xsl:text></Root></xsl:text>
</xsl:template>
<xsl:template match="/Root/ANode/FirstSubNode"/>
appiled XML跳过所有FirstSubNode ...我不知道出了什么问题。 有人可以帮我吗?谢谢!
<Root>
<ANode>
<SecondSubNode>value2</SecondSubNode>
</ANode>
<ANode>
<SecondSubNode>value4</SecondSubNode>
</ANode>
<ANode>
<SecondSubNode>value6</SecondSubNode>
</ANode><BNode></BNode></Root>
答案 0 :(得分:1)
您可以使用以下xsl样式表:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<Root>
<xsl:for-each select="//ANode">
<ANode>
<SecondSubNode><xsl:value-of select="SecondSubNode"/></SecondSubNode>
</ANode>
</xsl:for-each>
<BNode>
<xsl:for-each select="//ANode">
<FirstSubNode><xsl:value-of select="FirstSubNode"/></FirstSubNode>
</xsl:for-each>
</BNode>
</Root>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
这完全是疯了,但如果你真的必须:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8"/>
<xsl:template match="*">
<xsl:text><</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:for-each select="@*">
<xsl:text> </xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>="</xsl:text>
<xsl:value-of select="."/>
<xsl:text>"</xsl:text>
</xsl:for-each>
<xsl:text>></xsl:text>
<xsl:apply-templates select="node()"/>
<xsl:text></</xsl:text>
<xsl:value-of select="local-name()"/>
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="/Root">
<xsl:text><Root></xsl:text>
<xsl:apply-templates select="ANode"/>
<xsl:text><BNode></xsl:text>
<xsl:apply-templates select="ANode/FirstSubNode"/>
<xsl:text></BNode></xsl:text>
<xsl:text></Root></xsl:text>
</xsl:template>
<xsl:template match="ANode">
<xsl:text><ANode></xsl:text>
<xsl:apply-templates select="SecondSubNode"/>
<xsl:text></ANode></xsl:text>
</xsl:template>
</xsl:stylesheet>