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 select は正しいと思うので、考えられる唯一のことは、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 に答える