0

我有以下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中的命名空间有问题。谁能看到我做错了什么?

4

2 回答 2

2

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

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

您可以xmlns:ns="http://someurl/path/path/path"使用 xsl 中的名称定义该名称空间,然后在 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>
于 2012-09-20T22:33:48.420 回答
1

样式表命名空间应该http://www.w3.org/1999/XSL/Transform代替http://someurl/path/path/path.

此外,由于输入 XML 使用命名空间,所有 XPath 表达式都应该是命名空间限定的:

<xsl:template match="/" xmlns:ns1="http://someurl/path/path/path">
   <NewRootNode xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <NewChild1>
         <xsl:for-each select="ns1:RootNode/ns1:Child1">
            <NewNodeNameHere>
               <xsl:value-of select="ns1:GrandChild1"/>
            </NewNodeNameHere>
            <!-- lots of value-of tags in here -->
         </xsl:for-each>
      </NewChild1>
   </NewRootNode>
</xsl:template>
于 2012-09-20T22:33:18.453 回答