By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,490 Members | 3,266 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,490 IT Pros & Developers. It's quick & easy.

how do i create subset and union in XPath Query

P: n/a
Hi Friends,

I need a XPath query, whcih ll return me subset of data....
check below xml stream

<label id="MyExpenseDetails_lbl" xlink:role="terseLabel">Short Expense
Details</label>
<label id="MyExpenseDetails_lbl" xlink:role="displayLabel">Expense
Details</label>
<label id="InternalExpense_lbl" xlink:role="displayLabel">Internal
Expense</label>
<label id="ExternalExpense_lbl" xlink:role="terseLabel">Short External
Expense</label>

See above xml data having 4 label elements out of which 3 different IDs
and 2 different role.
MyExpenseDetails_lbl contain all 2 role, InternalExpense_lbl having
displayLabel and ExternalExpense_lbl having terseLabel

Now i want such XPath query or XQL command that return me collection of
label.
if user pass "terseLabel" label then label with role = "terseLabel"
should be return and the other one "InternalExpense_lbl" should also
return.

If user pass "displayLabel" label then label with only role =
"displayLabel" should be return.

Cond1: role = "terseLabel"
MyExpenseDetails_lbl (Short Expense Details) (only one record with role
= terseLabel )
InternalExpense_lbl (Internal Expense)
ExternalExpense_lbl (Short External Expense)

Cond2: role = "displayLabel"
MyExpenseDetails_lbl (Expense Details) (only one record with role =
displayLabel )
InternalExpense_lbl (Internal Expense)

There r also other more label roles , so i need it using XPath / XQL
query not by any hard coding

I tried below XPath Query but it's returning all 4 labels and i only
need as per my requirements. I mean if other label not exist for any
label then the default one i.e displayLabel should taken.

default:label[@xml:lang and @xlink:role=("terseLabel" or
"displayLabel")]

Thanks in advance
Regards
Rushikesh

Oct 26 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
I guess the big question is:

how is the user "passing" the required parameters ?

via a VBScript or JScript ?

via XSLT ?

I'm not familiar with XQL, but there are a few ways to pass parameters
and have them used in XPath, depending on the method you choose.

Oct 27 '05 #2

P: n/a
Hi,

I m passing it from ASP.NET code (C# application)...but it doesn't
matter....I am only interested in XPath Query...
Bcoz we have one class XMLDocument in which i have to pass a valid
XPath Query and that function ll return me set of XMLNodes...

currently i m passing below xpath string and that function is returning
me all 4 records which i don't required....
default:label[@xml:lang and @xlink:role=("terseLabel" or
"displayLabel")]

Thanks & Regards
Rushikesh

Oct 28 '05 #3

P: n/a
This is from the MS XML 4.0 SDK.

You can pass a parameter to an XSL file and have the XSL retrieve the
nodes you
want.

This way you can supply the XML, the XSL and the parameter and it'll
return the
HTML (or output) which you can then response.write to the page.

Example

var xslt = new ActiveXObject("Msxml2.XSLTemplate.4.0");
var xslDoc = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0" );
var xslProc;
xslDoc.async = false;
xslDoc.resolveExternals = false;
xslDoc.load("sample.xsl");
xslt.stylesheet = xslDoc;
var xmlDoc = new ActiveXObject("Msxml2.DOMDocument.4.0");
xmlDoc.async = false;
xmlDoc.resolveExternals = false;
xmlDoc.load("books.xml");
if (xmlDoc.parseError.errorCode <> 0) {
var myErr = xmlDoc.parseError;
alert("You have error " + myErr.reason);
} else {
xslProc = xslt.createProcessor();
xslProc.input = xmlDoc;
xslProc.addParameter("param1", "Hello");
xslProc.transform();
alert(xslProc.output);
}
File Name: Sample.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:param name="param1"/>
<xsl:template match="/">
The parameter value was: <xsl:value-of select="$param1"/>
</xsl:template>
</xsl:stylesheet>
[Visual Basic]
Visual Basic Syntax
objXSLProcessor.addParameter(baseName, parameter, namespaceURI)
Parameters
baseName
The name that will be used inside the style sheet to identify the
parameter context.
parameter
A number, Boolean, string, IXMLDOMNodeList, or IXMLDOMNode. Passing in
a single node will produce a node list that contains one node
(shortcut). To remove a parameter previously added to the processor,
provide a value of Empty or Null instead. This acts as a signal to the
processor to remove any previously added parameter of the same name.
namespaceURI (optional)
An optional namespace.
Example
Dim xslt As New Msxml2.XSLTemplate40
Dim xslDoc As New Msxml2.FreeThreadedDOMDocument40
Dim xmlDoc As New Msxml2.DOMDocument40
Dim xslProc As IXSLProcessor
xslDoc.async = False
xslDoc.resolveExternals = False
xslDoc.Load "sample.xsl"
Set xslt.stylesheet = xslDoc
xmlDoc.async = False
xmlDoc.resolveExternals = False
xmlDoc.Load "books.xml"
If (xmlDoc.parseError.errorCode <> 0) Then
Dim myErr
Set myErr = xmlDoc.parseError
MsgBox("You have error " & myErr.reason)
Else
Set xslProc = xslt.createProcessor()
xslProc.input = xmlDoc
xslProc.addParameter "param1", "Hello"
xslProc.Transform
MsgBox xslProc.output
End If
File Name: Sample.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:param name="param1"/>
<xsl:template match="/">
The parameter value was: <xsl:value-of select="$param1"/>
</xsl:template>
</xsl:stylesheet>
[C/C++]
C/C++ Syntax
HRESULT addParameter (BSTR baseName, VARIANT parameter, BSTR
namespaceURI);
Parameters
baseName [in]
The name that will be used inside the style sheet to identify the
parameter context.
parameter [in]
A number, Boolean, string, node list, or node. Passing in a single node
will produce a node list that contains one node (shortcut). To remove a
parameter previously added to the processor, you can pass a value of
VT_EMPTY, VT_NULL, or a NULL IDispatch or IUnknown instead. This acts
as a signal to the processor to remove any previously added parameter
of the same name.
namespaceURI [in, optional]
An optional namespace.
C/C++ Return Values
E_FAIL if readyState is READYSTATE_INTERACTIVE.

Example
#include "stdio.h"

#import <msxml4.dll>
using namespace MSXML2;

int checkParseError(IXMLDOMParseErrorPtr pError);
void dump_com_error(_com_error &e);
int main(int argc, char* argv[])
{

CoInitialize(NULL);
HRESULT hr;

try{

BOOL bResult = FALSE;
short sResult = FALSE;
IXMLDOMDocument2Ptr pStyleSheet=NULL;
IXSLTemplatePtr pIXSLTemplate=NULL;
IXSLProcessorPtr pXSLProcessor=NULL;

hr = pIXSLTemplate.CreateInstance(__uuidof(XSLTemplate4 0));
hr=pStyleSheet.CreateInstance(__uuidof(FreeThreade dDOMDocument40));
pStyleSheet->async = VARIANT_FALSE;
pStyleSheet->resolveExternals = VARIANT_FALSE;
hr=pStyleSheet->load("c:\\samplexsl.xml");
//check on the parser error
if(hr!=VARIANT_TRUE)
{
return checkParseError(pStyleSheet->parseError);
}

pIXSLTemplate->stylesheet = pStyleSheet.GetInterfacePtr();
pXSLProcessor = pIXSLTemplate->createProcessor();

IXMLDOMDocumentPtr pInputDoc;

hr = pInputDoc.CreateInstance(__uuidof(DOMDocument40));
pInputDoc->async = VARIANT_FALSE;
pInputDoc->resolveExternals = FALSE;
hr = pInputDoc->load("c:\\sampleXSLWithParam.xml");
//check on the parser error
if(hr!=VARIANT_TRUE)
{
return checkParseError(pInputDoc->parseError);
}

pInputDoc->async = VARIANT_FALSE;
pInputDoc->resolveExternals = FALSE;
pXSLProcessor->input = pInputDoc.GetInterfacePtr();

hr=pXSLProcessor->addParameter("param1", "Hello", "");

VARIANT_BOOL vtRet = pXSLProcessor->transform();
if(vtRet != VARIANT_TRUE)
{
MessageBox(NULL, "transformation failed","Error", MB_OK);
return -1;
}
_bstr_t bstrOutput = pXSLProcessor->Getoutput();
MessageBox(NULL, bstrOutput,"Transformed Output", MB_OK);

}
catch(_com_error &e)
{
dump_com_error(e);
}
return 0;
}
int checkParseError(IXMLDOMParseErrorPtr pError)
{
_bstr_t parseError =_bstr_t("At line ")+ _bstr_t(pError->Getline())
+ _bstr_t("\n")+ _bstr_t(pError->Getreason());
MessageBox(NULL,parseError, "Parse Error",MB_OK);
return -1;

}

void dump_com_error(_com_error &e)
{
printf("Error\n");
printf("\a\tCode = %08lx\n", e.Error());
printf("\a\tCode meaning = %s", e.ErrorMessage());
_bstr_t bstrSource(e.Source());
_bstr_t bstrDescription(e.Description());
printf("\a\tSource = %s\n", (LPCSTR) bstrSource);
printf("\a\tDescription = %s\n", (LPCSTR) bstrDescription);
}
Style Sheet: "d:\\inetpub\\wwwroot\\sampleXSLWithParam.xml"

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:param name="param1"/>
<xsl:template match="/">
The parameter value was: <xsl:value-of select="$param1"/>
</xsl:template>
</xsl:stylesheet>
Output (in a message box)

<?xml version="1.0" encoding="UTF-16"?>
<bar>
Add Parameter Test
</bar>

Oct 28 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.