|
Subject: Re: [xsl] Seek an XPath 2.0 expression for checking that each object in a file system has one parent From: "G. Ken Holman g.ken.holman@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sun, 16 Oct 2016 23:29:15 -0000 |
~/t/ftemp $ cat roger1.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<D1>
<D2/>
<F1/>
</D1>
<D2>
<F2/>
</D2>
</Root>
~/t/ftemp $ cat roger2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Root>
<D1>
<D2/>
<F1/>
</D1>
<D2>
<F2/>
<F1/>
</D2>
</Root>
~/t/ftemp $ xslt2 roger1.xml roger.xsl
true
true
true
~/t/ftemp $ xslt2 roger2.xml roger.xsl
false
false
false
~/t/ftemp $ cat roger.xsl
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0"><xsl:template match="/">
<xsl:value-of select="
count(/Root/*/*)=count(distinct-values(/Root/*/*/name(.)))"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="
every $elem in /Root/*/* satisfies
not($elem/following::*[not(*)]/node-name(.)=node-name($elem))"/>
<xsl:text>
</xsl:text>
<xsl:value-of select="
not( some $elem in /Root/*/* satisfies
$elem/following::*[not(*)]/node-name(.)=node-name($elem))"/>
<xsl:text>
</xsl:text>
</xsl:template></xsl:stylesheet> ~/t/ftemp $
Hi Folks,
I am modeling a file system. Below is a sample instance. D1 means Directory 1, F1 means File 1, etc. The instance says this: the content of directory 1 is directory 2 and file 1. The content of directory 2 is file 2. Stated another way, directory 2 and file 1 are contained in directory 1, and file 2 is contained in directory 2.
<Root> <D1> <D2/> <F1/> </D1> <D2> <F2/> </D2> </Root>
I want an XPath 2.0 expression which returns true if each object has one parent. An "object" is a directory or a file. In the example above each object has one parent, so the XPath should return true. Below is an illegal file system because F1 has two parents: D1 and D2.
<Root> <D1> <D2/> <F1/> </D1> <D2> <F2/> <F1/> </D2> </Root>
The XPath should return false.
This XPath is almost correct:
for $i in /Root/* return for $j in $i/* return not(name($j) = $i/following-sibling::*/*/name())
I say it is "almost" correct because it returns multiple Booleans, not a single Boolean result.
Two Questions:
1. What is the correct XPath expression?
2. Is there a different way to model in XML a file system that would enable a simple XPath expression?
/Roger
-- Check our site for free XML, XSLT, XSL-FO and UBL developer resources | Streaming hands-on XSLT/XPath 2 training @US$45: http://goo.gl/Dd9qBK | Crane Softwrights Ltd. _ _ _ _ _ _ http://www.CraneSoftwrights.com/s/ | G Ken Holman _ _ _ _ _ _ _ _ _ _ mailto:gkholman@xxxxxxxxxxxxxxxxxxxx | Google+ blog _ _ _ _ _ http://plus.google.com/+GKenHolman-Crane/posts | Legal business disclaimers: _ _ http://www.CraneSoftwrights.com/legal |
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Seek an XPath 2.0 express, David Carlisle d.p.c | Thread | Re: [xsl] Seek an XPath 2.0 express, Dimitre Novatchev dn |
| Re: [xsl] Seek an XPath 2.0 express, David Carlisle d.p.c | Date | Re: [xsl] Seek an XPath 2.0 express, Dimitre Novatchev dn |
| Month |