Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" />
<node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8" />
and so on.
Let's suppose I want to retrieve this @url parameter, BUT ONLY with the
values, in querystring, associated with "foo" and "foo2" (thus
discarding name1, name2, name4 and every other different ones).
In other words, I must obtain:
mypage.php?foo=bar&foo2=bar2
myotherpage.php?&foo=bar3&foo2=bar5
.... and so on.
Is there a convenient way, in a transformation with XSL, to obtain this
string manipulation? (I'd prefer to stick to XSLT1.0, if possible)
Thanks in advance for your help. 11 4527
Ebenezer wrote:
Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" />
<node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8" />
and so on.
Let's suppose I want to retrieve this @url parameter, BUT ONLY with the
values, in querystring, associated with "foo" and "foo2" (thus
discarding name1, name2, name4 and every other different ones).
In other words, I must obtain:
mypage.php?foo=bar&foo2=bar2
myotherpage.php?&foo=bar3&foo2=bar5
... and so on.
Is there a convenient way, in a transformation with XSL, to obtain this
string manipulation? (I'd prefer to stick to XSLT1.0, if possible)
Well
substring-before(node/@url, '?')
would give you the file name, the query string would need to be parsed
which needs a recursive template or an extension function in XSLT 1.0.
In XSLT 2.0 you could use the tokenize function and/or xsl:analyze-string:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/2008/mf"
exclude-result-prefixes="xsd mf"
version="2.0">
<xsl:function name="mf:get-query" as="xsd:string">
<xsl:param name="qs" as="xsd:string"/>
<xsl:param name="params" as="xsd:string*"/>
<xsl:variable name="filtered-qs" as="xsd:string*">
<xsl:for-each select="tokenize($qs, '&')">
<xsl:analyze-string
select="."
regex="({string-join($params, '|')})=\w*">
<xsl:matching-substring>
<xsl:sequence select="regex-group(0)"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:for-each>
</xsl:variable>
<xsl:sequence select="string-join($filtered-qs, '&')"/>
</xsl:function>
<xsl:template match="node">
<xsl:value-of select="concat(substring-before(@url, '?'), '?',
mf:get-query(substring-after(@url, '?'), ('foo', 'foo2')))"/>
</xsl:template>
</xsl:stylesheet>
--
Martin Honnen http://JavaScript.FAQTs.com/
Thanks a lot for sharing and helping, Martin, your information is so
valuable, I'll carefully study your code.
Martin Honnen ha scritto:
Ebenezer wrote:
>Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" /> <node url="myotherpage.php?name4=value4&foo=bar3&foo2=b ar5&name2=value8" />
and so on.
Let's suppose I want to retrieve this @url parameter, BUT ONLY with the values, in querystring, associated with "foo" and "foo2" (thus discarding name1, name2, name4 and every other different ones).
In other words, I must obtain:
mypage.php?foo=bar&foo2=bar2 myotherpage.php?&foo=bar3&foo2=bar5 ... and so on.
Is there a convenient way, in a transformation with XSL, to obtain this string manipulation? (I'd prefer to stick to XSLT1.0, if possible)
Well
substring-before(node/@url, '?')
would give you the file name, the query string would need to be parsed
which needs a recursive template or an extension function in XSLT 1.0.
In XSLT 2.0 you could use the tokenize function and/or xsl:analyze-string:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:mf="http://example.com/2008/mf"
exclude-result-prefixes="xsd mf"
version="2.0">
<xsl:function name="mf:get-query" as="xsd:string">
<xsl:param name="qs" as="xsd:string"/>
<xsl:param name="params" as="xsd:string*"/>
<xsl:variable name="filtered-qs" as="xsd:string*">
<xsl:for-each select="tokenize($qs, '&')">
<xsl:analyze-string
select="."
regex="({string-join($params, '|')})=\w*">
<xsl:matching-substring>
<xsl:sequence select="regex-group(0)"/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:for-each>
</xsl:variable>
<xsl:sequence select="string-join($filtered-qs, '&')"/>
</xsl:function>
<xsl:template match="node">
<xsl:value-of select="concat(substring-before(@url, '?'), '?',
mf:get-query(substring-after(@url, '?'), ('foo', 'foo2')))"/>
</xsl:template>
</xsl:stylesheet>
Ebenezer schrieb:
Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" />
<node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8" />
If you have this, it's not XML. Instead of '&' in the url attribute
value, write '&'.
--
Johannes Koch
In te domine speravi; non confundar in aeternum.
(Te Deum, 4th cent.)
"Ebenezer" <va*********@spam.comwrote in message
news:5j********************@twister1.libero.it...
Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" />
<node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8"
/>
and so on.
Let's suppose I want to retrieve this @url parameter, BUT ONLY with the
values, in querystring, associated with "foo" and "foo2" (thus discarding
name1, name2, name4 and every other different ones).
In other words, I must obtain:
mypage.php?foo=bar&foo2=bar2
myotherpage.php?&foo=bar3&foo2=bar5
... and so on.
Is there a convenient way, in a transformation with XSL, to obtain this
string manipulation? (I'd prefer to stick to XSLT1.0, if possible)
Thanks in advance for your help.
Using FXSL 1.x and its "str-split-to-words" template, such processing is
trivial.
This transformation:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext"
>
<xsl:import href="strSplit-to-Words.xsl"/>
<!-- To be applied upon: testTokenize2.xml -->
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@url">
<xsl:attribute name="{name()}">
<xsl:variable name="vHdUrl" select=
"substring-before(.,'?')"
/>
<xsl:variable name="vTlUrl" select=
"substring-after(.,'?')"
/>
<xsl:variable name="vFilteredActions">
<xsl:call-template name="filterActions">
<xsl:with-param name="pInput" select="$vTlUrl"/>
<xsl:with-param name="pMustStart" select="'foo'"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select=
"concat($vHdUrl,'?',$vFilteredActions)"
/>
</xsl:attribute>
</xsl:template>
<xsl:template name="filterActions">
<xsl:param name="pInput"/>
<xsl:param name="pMustStart" select="'x'"/>
<xsl:variable name="vTokens">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="$pInput"/>
<xsl:with-param name="pDelimiters" select="'&'"/>
</xsl:call-template>
</xsl:variable>
<xsl:for-each select=
"ext:node-set($vTokens)/word
[starts-with(.,$pMustStart)]"
>
<xsl:variable name="vactDelim">
<xsl:if test="position() 1">&</xsl:if>
</xsl:variable>
<xsl:value-of select="concat($vactDelim, .)"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
when applied on this xml document:
<nodes>
<node
url="mypage.php?name1=value1&foo=bar&foo2= bar2&name2=value0" />
<node
url="myotherpage.php?name4=value4&foo=bar3& ;foo2=bar5&name2=value8"
/>
</nodes>
produces the wanted results:
<nodes>
<node url="mypage.php?foo=bar&foo2=bar2"/>
<node url="myotherpage.php?foo=bar3&foo2=bar5"/>
</nodes>
Hope this helped.
Cheers,
Dimitre Novatchev
Johannes Koch ha scritto:
Ebenezer schrieb:
>Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" /> <node url="myotherpage.php?name4=value4&foo=bar3&foo2=b ar5&name2=value8" />
If you have this, it's not XML. Instead of '&' in the url attribute
value, write '&'.
Of course, but the parser I use won't bother on that.
Dimitre Novatchev ha scritto:
"Ebenezer" <va*********@spam.comwrote in message
news:5j********************@twister1.libero.it...
Using FXSL 1.x and its "str-split-to-words" template, such processing is
trivial.
Unfortunately, I use another engine.
"Ebenezer" <va*********@spam.comwrote in message
news:AA********************@twister1.libero.it...
Dimitre Novatchev ha scritto:
>"Ebenezer" <va*********@spam.comwrote in message news:5j********************@twister1.libero.it. .. Using FXSL 1.x and its "str-split-to-words" template, such processing is trivial.
Unfortunately, I use another engine.
Hmm... Did I say that a specific "engine" was necessary for the solution?
FXSL 1.x works with *any* XSLT 1.0 processor that supports the
exsl:node-set() extension function.
There are 3 separate versions for MSXML, Xalan and Saxon, although the last
two XSLT 1.0 processors implement exsl:node-set().
For MSXML, there is a way to implement exslt:node-set() (and in any XSLT
processor that supports extension functions written in inline-JavaScript).
See: http://www.jenitennison.com/blog/node/24
Lastly, FXSL 2.0 is the latest (since the last 4-5 years) version of FXSL
which is written in and for XSLT 2.0. It doesn't use any extension functions
at all.
"Ebenezer" <va*********@spam.comwrote in message
news:4A********************@twister1.libero.it...
Johannes Koch ha scritto:
>Ebenezer schrieb:
>>Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" /> <node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8" />
If you have this, it's not XML. Instead of '&' in the url attribute value, write '&'.
Of course, but the parser I use won't bother on that.
Then this is not a true (compliant) XML parser.
>Unfortunately, I use another engine.
>
Hmm... Did I say that a specific "engine" was necessary for the solution?
Or did you think that FXSL was an "engine"?
It most certainly isn't an "engine".
FXSL is a library of functions/templates, written in pure XSLT. As such, its
functions can be used under any compliant XSLT 2.0 processor or any
compliant XSLT 1.0 processor that either implements the exsl:node-set()
extension function, or is one of the following XSLT 1.0 processors: MSXML
(3,4,6), Xalan, Saxon.
Cheers,
Dimitre Novatchev
"Dimitre Novatchev" <dn********@cnntp.orgwrote in message
news:49***********************@read.cnntp.org...
>
"Ebenezer" <va*********@spam.comwrote in message
news:AA********************@twister1.libero.it...
>Dimitre Novatchev ha scritto:
>>"Ebenezer" <va*********@spam.comwrote in message news:5j********************@twister1.libero.it.. . Using FXSL 1.x and its "str-split-to-words" template, such processing is trivial.
Unfortunately, I use another engine.
Hmm... Did I say that a specific "engine" was necessary for the solution?
FXSL 1.x works with *any* XSLT 1.0 processor that supports the
exsl:node-set() extension function.
There are 3 separate versions for MSXML, Xalan and Saxon, although the
last two XSLT 1.0 processors implement exsl:node-set().
For MSXML, there is a way to implement exslt:node-set() (and in any XSLT
processor that supports extension functions written in inline-JavaScript).
See:
http://www.jenitennison.com/blog/node/24
Lastly, FXSL 2.0 is the latest (since the last 4-5 years) version of FXSL
which is written in and for XSLT 2.0. It doesn't use any extension
functions at all.
Dimitre Novatchev ha scritto:
"Ebenezer" <va*********@spam.comwrote in message
news:4A********************@twister1.libero.it...
>Johannes Koch ha scritto:
>>Ebenezer schrieb: Let's suppose I have some nodes in an XML file, with an URL attribute:
<node url="mypage.php?name1=value1&foo=bar&foo2=bar2&nam e2=value0" /> <node url="myotherpage.php?name4=value4&foo=bar3&foo2=ba r5&name2=value8" /> If you have this, it's not XML. Instead of '&' in the url attribute value, write '&'.
Of course, but the parser I use won't bother on that.
Then this is not a true (compliant) XML parser.
You got it :)
Dimitre Novatchev ha scritto:
>>Unfortunately, I use another engine.
Hmm... Did I say that a specific "engine" was necessary for the solution?
Or did you think that FXSL was an "engine"?
It most certainly isn't an "engine".
FXSL is a library of functions/templates, written in pure XSLT. As such, its
functions can be used under any compliant XSLT 2.0 processor or any
compliant XSLT 1.0 processor that either implements the exsl:node-set()
extension function, or is one of the following XSLT 1.0 processors: MSXML
(3,4,6), Xalan, Saxon.
Yes, actually I thought that it was an engine, never heard of this library.
Lot of thanks for sharing and helping, Dimitre, I'll dig into that too.
Cheers. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Ramon M. Felciano |
last post by:
Helo all --
I'm trying to gain a deeper understand for what type of
semi-declarative programming can be done through XML and XPath/XSLT.
I'm looking at graph processing problems as a testbed for...
|
by: inquirydog |
last post by:
Hi-
Does anyone know a way to compare whether two nodes contain
the same information in xslt (the name, attributes, and all content
recursivly should be the same. I am interested in the case...
|
by: Paulo Pinto |
last post by:
Hi,
I have already several XSLT stylesheets that
make use of <xslt:include> "command". Now
I wanted to make them a bit more modular but
I'm stuck.
I want to take out the generated HTML code...
|
by: Lars Both |
last post by:
Hi everybody,
i want to do the following. I have data in a XML-File.
Additionaly I have a XML Schema which defines valid values for every field
and alternative options.
Now I want to create a...
|
by: Moogy |
last post by:
I'm pulling my hair out here. First, I'm new to XML, so that doesn't
help, but none of this makes any sense to me. All I'm trying to do is
take a simple source XML file and translate it with an...
| |
by: AA |
last post by:
Hello, I need to extract an element from a xml document something like this
<myXml>
<Header>
<Name/>
<LastName/>
<Age/>
</Head>
<Body>
<Properties>
|
by: Dana B |
last post by:
I am trying to get the values in FIELD2 and FIELD3 in the XML file
below using XSLT. I can get the value of CLOB_DATA. It comes back as
an string. How can I extract the values FIELD2 and FIELD3?...
|
by: rbrunn |
last post by:
Hi all,
I'm trying to write a XSL-transformation which converts AI-exported
SVG-Files to be more compatible with firefox. Namely I want to extract
gradients which are declared inside of symbol...
|
by: nayijitu |
last post by:
Hi,
I need some thing like this.
I have an XML file and it contain some elements(tag) with a proper hierarchy...
In that XML a particular element <page> contain some child node element like...
|
by: Shannon Mayne |
last post by:
I would like to ask how one might obtain the assigned name of an
assigned object as a string. I would like to use object names as an
algorithmic input.
To demonstrate... So if i have:
...
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
| |
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
|
by: tracyyun |
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
| |
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
|
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence...
| |