
At 2012-06-12 18:44 +0100, McGibbney, Lewis John wrote:
In particular I wish to grab every occurrence of an <xs:element> where the substitutionGroup value is equal to "ifc:IfcBuildingElement"
I've been using the following xsl code and it is not working.
<?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" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl" xmlns:ifc="http://www.iai-tech.org/ifcXML/IFC2x3/FINAL" exclude-result-prefixes="xs xd" version="2.0"> <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> <xsl:strip-space elements="*"/>
<xsl:template name="main" match="/"> <xsl:for-each select="xs:schema/xs:element"> <xsl:if test="@substitutionGroup[contains(text(), ifc:IfcBuildingElement)]">
Above you are asking to compare a text node with the child element named IfcBuildingElement in the namespace associated with the ifc prefix. Two problems: attribute nodes never contain text node children, and you are asking for the content of a child element rather than simple text. Do you not just want the following? <xsl:if test="contains(@substitution,'ifc:IfcBuildingElement')"> But up above you say "is equal to" so that means you could probably live with a simple string comparison (which does nothing about string normalization): <xsl:if test="@substitution='ifc:IfcBuildingElement'"> Note this does not accommodate namespsce prefix dereferencing ... you are just checking for a string. Which is what I think you are asking for.
<xsl:value-of select="xs:schema/xs:element"/>
At this point you are addressing an xs:schema child of the previously selected xs:element, which is also wrong ... I suspect you don't want to walk away from the element you just tested. Do you want the element's name? You are asking for the string value of the element's descendants and I don't think you want that. That will always just be white space in the schema. Did you want to copy the element declarations? If so you could have: <xsl:copy-of select="xs:schema/ xs:element[@substitutionGroup='ifc:IfcBuildingElement']"/>
It would be great if someone could point out to me either the incorrect syntax or the absence of the correct configuration.
I hope this helps. If you could find some basic instruction on XPath nodes and node addressing, it would help you to understand where you went wrong. . . . . . . . . . Ken -- Public XSLT, XSL-FO, UBL and code list classes in Europe -- Oct 2012 Contact us for world-wide XML consulting and instructor-led training Free 5-hour lecture: http://www.CraneSoftwrights.com/links/udemy.htm Crane Softwrights Ltd. http://www.CraneSoftwrights.com/m/ G. Ken Holman mailto:gkholman@CraneSoftwrights.com Google+ profile: https://plus.google.com/116832879756988317389/about Legal business disclaimers: http://www.CraneSoftwrights.com/legal