如何使用XSL移动特定的XML节点

时间:2014-08-11 10:03:15

标签: xml xslt

我有一个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>&lt;</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>&gt;</xsl:text>
    <xsl:apply-templates select="node()"/>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="local-name()"/>
    <xsl:text>&gt;</xsl:text>
</xsl:template>

<xsl:template match="/Root">
    <xsl:text>&lt;Root&gt;</xsl:text>
    <xsl:apply-templates select="node()"/>

    <xsl:if test="ANode">
        <xsl:text>&lt;BNode&gt;</xsl:text>
        <xsl:for-each select="ANode">
            <xsl:copy>
                <xsl:apply-templates select="FirstSubNode"/>
            </xsl:copy>
        </xsl:for-each>
        <xsl:text>&lt;/BNode&gt;</xsl:text>
    </xsl:if>
    <xsl:text>&lt;/Root&gt;</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>

2 个答案:

答案 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>&lt;</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>&gt;</xsl:text>
    <xsl:apply-templates select="node()"/>
    <xsl:text>&lt;/</xsl:text>
    <xsl:value-of select="local-name()"/>
    <xsl:text>&gt;</xsl:text>
</xsl:template>

<xsl:template match="/Root">
    <xsl:text>&lt;Root&gt;</xsl:text>
        <xsl:apply-templates select="ANode"/>
        <xsl:text>&lt;BNode&gt;</xsl:text>
            <xsl:apply-templates select="ANode/FirstSubNode"/>
        <xsl:text>&lt;/BNode&gt;</xsl:text>
    <xsl:text>&lt;/Root&gt;</xsl:text>
</xsl:template>

<xsl:template match="ANode">
    <xsl:text>&lt;ANode&gt;</xsl:text>
        <xsl:apply-templates select="SecondSubNode"/>
    <xsl:text>&lt;/ANode&gt;</xsl:text>
</xsl:template>

</xsl:stylesheet>