|
Subject: Re: [xsl] Q: XSLT 1.0 output of namespace From: Hermann Stamm-Wilbrandt <STAMMW@xxxxxxxxxx> Date: Tue, 17 Aug 2010 16:26:11 +0200 |
Michael,
> It might be simpler, but it's wrong. Firstly, the expression
> attribute::*[name()] is rather pointless: it selects all attribute that
> have a name, and all of them do.
I did not realize that because the testcases worked.
> While namespace::*[name()] selects all
> namespaces except the default namespace, so your test will fail for that
> one.
You are absolutely right.
Your counting technique works on the nodes which is correct and not on
string values which is incorrect.
is-no-attribute-and-no-namespace():
"count(. | ../attribute::* | ../namespace::*) !=
count(../attribute::* | ../namespace::*)"
is-attribute(): "count(. | ../@*) = count(../@*)"
is-namespace(): "count(. | ../namespace::*) = count(../namespace::*)"
Thank you for that technique!
This is the diff for the tool, I updated dynxp.xsl [1] and xpath++ tool
[2].
$ diff -u dynxp.xsl.posted dynxp.xsl
--- dynxp.xsl.posted 2010-08-17 15:27:10.000000000 +0200
+++ dynxp.xsl 2010-08-17 15:59:33.000000000 +0200
@@ -26,12 +26,12 @@
<xsl:copy-of select="."/>
</xsl:when>
<xsl:when
- test="name() and
- not(. = ../attribute::*[name()] | ../namespace::*[name()])">
+ test="count(. | ../attribute::* | ../namespace::*) !=
+ count(../attribute::* | ../namespace::*)">
<xsl:copy-of select="."/>
</xsl:when>
<xsl:otherwise>
- <xsl:if test="not(. = ../attribute::*[name()])">
+ <xsl:if test="count(. | ../namespace::*) = count
(../namespace::*)">
<xsl:text>xmlns</xsl:text>
<xsl:if test="name()">:</xsl:if>
</xsl:if>
$
Now correct output is generated for your sample:
$ xsltproc --stringparam xpathpar "//namespace::*" dynxp.xsl i.xml
-------------------------------------------------------------------------------
xmlns:xml="http://www.w3.org/XML/1998/namespace"
-------------------------------------------------------------------------------
xmlns:a="http://my.namespace/"
-------------------------------------------------------------------------------
xmlns:xs="http://www.w3.org/2001/XMLSchema"
$
$ xsltproc --stringparam xpathpar "//attribute::*" dynxp.xsl i.xml
-------------------------------------------------------------------------------
targetNamespace="http://my.namespace/"
$
$ xsltproc --stringparam xpathpar "//node()" dynxp.xsl i.xml
-------------------------------------------------------------------------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:a="http://my.namespace/" targetNamespace="http://my.namespace/"/>
$
[1]
http://stamm-wilbrandt.de/en/xsl-list/dynxp.xsl
[2]
https://www.ibm.com/developerworks/forums/thread.jspa?messageID=14455521�
Mit besten Gruessen / Best wishes,
Hermann Stamm-Wilbrandt
Developer, XML Compiler, L3
WebSphere DataPower SOA Appliances
----------------------------------------------------------------------
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294
From: Michael Kay <mike@xxxxxxxxxxxx>
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Date: 08/17/2010 02:56 PM
Subject: Re: [xsl] Q: XSLT 1.0 output of namespace
> In getting to the solution below I found that
> ". = ../namespace::*[name()]"
> as "is-namespace()" test is even simpler than Michael's
> "count(. | ../@*) != count(../@*)".
>
> Similarly ". = ../attribute::*[name()]" can be used as "is-attribute()".
>
>
It might be simpler, but it's wrong. Firstly, the expression
attribute::*[name()] is rather pointless: it selects all attribute that
have a name, and all of them do. While namespace::*[name()] selects all
namespaces except the default namespace, so your test will fail for that
one.
Secondly, it's quite possible to have an attribute and a namespace with
the same string-value, for example
<xs:schema xmlns:a="http://my.namespace/"
targetNamespace="http://my.namespace/">
and in this case your test for a namespace and your test for an
attribute will both return true.
Michael Kay
Saxonica
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Q: XSLT 1.0 output of nam, Michael Kay | Thread | [xsl] problem with xsl:import and n, Jostein Austvik Jaco |
| Re: [xsl] flexibly sized region aft, G. Ken Holman | Date | [xsl] How to force prefixes instead, Maurice Mengel |
| Month |