XSLT转换错误

时间:2012-09-20 22:09:43

标签: xslt

我有以下xml:

<RootNode xmlns="http://someurl/path/path/path">
    <Child1>
        <GrandChild1>Value</GrandChild1>
        <!-- Lots more elements in here-->
    </Child1>
</RootNode>

我有以下xslt:

<xsl:stylesheet version="1.0" xmlns="http://someurl/path/path/path" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
        <NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <NewChild1>
                <xsl:for-each select="RootNode/Child1">
                    <NewNodeNameHere>
                        <xsl:value-of select="GrandChild1"/>
                    </NewNodeNameHere>
                <!-- lots of value-of tags in here -->
                </xsl:for-each>
            </NewChild1>
        </NewRootNode >
    </xsl:template>
</xsl:stylesheet>

问题:这是我的结果:

<?xml version="1.0" encoding="utf-8"?>
<NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NewChild1 />
</NewRootNode>

我期待看到:

<?xml version="1.0" encoding="utf-8"?>
<NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <NewChild1>
        <NewNodeNameHere>Value</NewNodeNameHere>
        <!-- Other new elements with values from the xml file -->
    </NewChild1>
</NewRootNode>

我缺少应该在那里的NewChild1内部的信息。

我认为我的for-each选择是正确的,所以我唯一能想到的是Xml中的命名空间和xslt中的命名空间存在问题。谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题是由名称空间引起的。

由于xml定义了xmlns="http://someurl/path/path/path",因此它不再位于默认命名空间中。

您可以在xsl中使用名称xmlns:ns="http://someurl/path/path/path"定义该命名空间,然后在XPath表达式中使用该名称。

以下适用于我:

<xsl:stylesheet version="1.0" xmlns:ns="http://someurl/path/path/path" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
    <NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <NewChild1>
            <xsl:for-each select="ns:RootNode/ns:Child1">
                <NewNodeNameHere>
                    <xsl:value-of select="ns:GrandChild1"/>
                </NewNodeNameHere>
            <!-- lots of value-of tags in here -->
            </xsl:for-each>
        </NewChild1>
    </NewRootNode >
    </xsl:template>
</xsl:stylesheet>