こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

xslのdocument関数で読込んだ2つのxmlをxsl:sortしたい

次のXSLで動作させています。

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xml:space="default" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:for-each select="document('取り込むXMLファイル')//z:row">
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
<xsl:for-each select="//z:row">
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

ここまでは出来たのですが、xsl:sortでまとめてsortするにはどうすればいいのでしょうか?

投稿日時 - 2005-09-15 20:49:26

QNo.1651656

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは、なんか、変な風にとられてもいやなので、他の人の回答が付くのを待ってましたが、付かないようなので、また回答しておきます。
(また!)勘違いコメントだったらすみません。
*
<xsl:for-each select="document('取り込むXMLファイル')//z:row">
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
<xsl:for-each select="//z:row">
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
の部分を
<xsl:for-each select="//z:row|document('取り込むXMLファイル')//z:row">
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
のように、まずは、1つにまとめることができます。
そうすることで、xsl:sortでまとめてsortできます。
xsl:sortについては、既知かもしれませんが
<xsl:for-each select="//z:row|document('取り込むXMLファイル')//z:row">
<xsl:sort select="ソートキー" lang="ja" data-type="text" order="ascending" />
<xsl:value-of select="@取り出したい属性の名前" />
</xsl:for-each>
のように書きます。
ソートキーが数値の場合、data-typeにはnumberを
降順にするには、orderをdescendingにします。

投稿日時 - 2005-09-16 04:28:49

補足

ありがとうございます、
BLUEPIXYさんのアドバイスで上手くいきました!

なんか変かもしれないですよね、僕はほんと感謝してますけど(笑

本当は下のようなソースでまったく同じ構造の2つのXMLソースを読み込み
pDoc_xml1,pDoc_xml2をXSLでなくDOMで結合したいのですが、どうしたらよいのでしょうか?

xml1,2読み込み(XMLのソース以外は同じソースです)
IXMLDOMDocumentPtr pDoc_xml;
IXMLDOMNodeListPtr pNodeList;
IXMLDOMNode *pIXMLDOMNode=NULL;
HRESULT hr;

SYSTEMTIME st;
GetLocalTime(&st);

char szDate[64];

pDoc_xml.CreateInstance(__uuidof(DOMDocument30));
pDoc_xml->put_async(VARIANT_FALSE);
pDoc_xml->validateOnParse = FALSE;

sprintf(szPath_Xml, "%s\\result\\xml1.xml(またはxml2.xml)", szPath);
pDoc_xml->load( _variant_t(szPath_Xml) );

sprintf(szDate, "//z:row[@INTIME>'%d/%02d/%02d 12:00:00']", st.wYear, st.wMonth, st.wDay);
pNodeList = pDoc_xml->selectNodes(szDate);

IXMLDOMSelection *pIXMLDOMSelection=NULL;
hr = pNodeList->QueryInterface(IID_IXMLDOMSelection, (void**)&pIXMLDOMSelection );

if(SUCCEEDED(hr) && pIXMLDOMSelection){

LONG uLength;
hr = pIXMLDOMSelection->get_length(&uLength);

if(SUCCEEDED(hr)){
pIXMLDOMSelection->removeAll();
}

}
pDoc_xml->save(szPath_Xml);


結合したいのは
xml1.xml(xml2.xml):

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="MACHINE" rs:number="1" rs:nullable="true" rs:write="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/>
</s:AttributeType>
<s:AttributeType name="PARTS_NO" rs:number="2" rs:nullable="true" rs:write="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/>
</s:AttributeType>
<s:AttributeType name="STATUS" rs:number="3" rs:nullable="true" rs:write="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/>
</s:AttributeType>
<s:AttributeType name="STOCK_NUM" rs:number="3" rs:nullable="true" rs:write="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/>
</s:AttributeType>
<s:AttributeType name="INTIME" rs:number="3" rs:nullable="true" rs:write="true">
<s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="8190"/>
</s:AttributeType>
<s:extends type="rs:rowbase"/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row MACHINE="APPLE" PARTS_NO="1" STATUS="WAIT" STOCK_NUM="4" INTIME="2005/09/09 12:33:11"/>
<z:row MACHINE="DELL" PARTS_NO="2" STATUS="ENOUGH" STOCK_NUM="43" INTIME="2005/09/05 11:13:12"/>
<z:row MACHINE="NEC" PARTS_NO="3" STATUS="EMPTY" STOCK_NUM="1" INTIME="2005/09/09 02:03:01"/>
<z:row MACHINE="HP" PARTS_NO="4" STATUS="WAIT" STOCK_NUM="3" INTIME="2005/03/09 11:32:31"/>
</rs:data>
</xml>

の xml1.xmlの<rs:data>の子のz:rowをxml2.xmlの<rs:data>の子として結合させたいです。

投稿日時 - 2005-09-16 10:02:50

お礼

補足させてください、

IXMLDOMDocumentPtr pDoc_xml1;
IXMLDOMDocumentPtr pDoc_xml2;

[XMLの読み込みは先のソースの通りです。]

IXMLDOMNode *pIXMLDOMNode1 = NULL;
IXMLDOMNode *pIXMLDOMNode2 = NULL;

//xml1
pIXMLDOMNode1 = pDoc_xml1->selectSingleNode("//z:row");

//xml2
pIXMLDOMNode2 = pDoc_xml2>selectSingleNode("//rs:data");

//xml1+xml2
pIXMLDOMNode2->appendChild(pIXMLDOMNode1);

としたのですがappendChildでエラーを起こして落ちてしまいます。
開発環境はVC++6.0 MSXML3.0です。
importNodeを使うという書き込みも見たのですが、
pDoc_xml1->としても、そのようなメソッドは現れませんでした。


アドバイスを頂けないでしょうか?

投稿日時 - 2005-09-16 13:18:19

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問