Subject: Re: [xsl] Really want a zipper From: "Ihe Onwuka ihe.onwuka@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Mon, 30 May 2016 16:41:07 -0000 |
Yup. I omitted a field from one of the complexType definitions and so one of the fields from the instance couldn't be paired up with an element name and I went on a wild goose chase hacking the stylesheet instead of checking the schema. On Mon, May 30, 2016 at 5:44 AM, Ihe Onwuka ihe.onwuka@xxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > Well I have solved it by explicitly testing that the element name > generated is not zero-length > > <xsl:template match="field"> > <xsl:param name="recordType"/> > <xsl:variable name="pos" select="position()"/> > <xsl:variable name="elemName" > select="$recordType/xs:element[$pos]/@name/string()"/> > <xsl:if test="normalize-space($elemName)"> > <xsl:element name="{$elemName}"> > <xsl:apply-templates/> > </xsl:element> > </xsl:if> > </xsl:template> > > If anybody can see how I was getting zero-length element names in the > first place I would be eager to know because that test appears to be > redundant. > > The only possible explanation is that there is a mismatch between the > number of field elements and the number of xs:elements they are being > matched to so maybe I should look further upstream. > > Thank you again dimitre > > On Mon, May 30, 2016 at 5:31 AM, Ihe Onwuka ihe.onwuka@xxxxxxxxx < > xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > >> Ughhh. Scratch the last post as it is full of mistakes. Here is the >> correction. >> >> Yes that is the correct result - my apologies for not making that >> explicit and thank you for your answer and the problem you posted works as >> you designed it on my setup. >> >> However I cannot do a straight transcription because the full problem is >> more complex than posted. The schema actually has several complexTypes so >> putting all the xs:element/@name in a variable will not work. Let me pose >> this a different way by focusing on the field template below. >> >> <xsl:template match="field"> >> <xsl:param name="recordType"/> >> <xsl:variable name="pos" select="position()"/> >> <field> >> <xsl:value-of >> select="$recordType/xs:element[$pos]/@name/string()"/> >> </field> >> </xsl:template> >> >> Suppose I have the above where the param recordType contains the parent >> xs:sequence of the correct set of xs:elements. So in this instance >> $recordType contains >> >> <xs:sequence> >> <xs:element name="recordCode"> >> <xs:simpleType> >> <xs:restriction base="Text2Type"> >> <xs:enumeration value="01"/> >> </xs:restriction> >> </xs:simpleType> >> </xs:element> >> <xs:element name="tradingPartner" type="TradingPartnerType"/> >> <xs:element name="issuerStateCode" type="Text2Type"/> >> <xs:element name="HIOSid" type="HIOSIDType"/> >> <xs:element name="issuerExtractDate" type="xs:date"/> >> </xs:sequence> >> >> and I get. >> >> <midas> >> <issuerSummary> >> <field>recordCode</field> >> <field>tradingPartner</field> >> <field>issuerStateCode</field> >> <field>HIOSid</field> >> <field>issuerExtractDate</field> >> </issuerSummary> >> </midas> >> >> So the correct fields are being picked up and everything works when the >> field names are treated as data. >> >> So all I have to do now is to make the element names the content of the >> field elements. >> >> But if I move the exact same expression from the value-of into the AVT of >> the name attribute of xs:element like so (assume the apply-templates is >> handled by an identity template) >> >> <xsl:template match="field"> >> <xsl:param name="recordType"/> >> <xsl:variable name="pos" select="position()"/> >> <xsl:element name="{$recordType/xs:element[$pos]/@name/string()}"> >> <xsl:apply-templates/> >> </xsl:element> >> </xsl:template> >> >> I get XTDE0820: Supplied element name is a zero-length string. >> >> So what I really need to know is why that happens. >> >> >> On Mon, May 30, 2016 at 5:24 AM, Ihe Onwuka ihe.onwuka@xxxxxxxxx < >> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >> >>> >>> >>> On Sun, May 29, 2016 at 11:24 PM, Dimitre Novatchev dnovatchev@xxxxxxxxx >>> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >>> >>>> If my guess about the wanted result is correct, then this >>>> transformation: >>>> >>>> <xsl:stylesheet version="2.0" xmlns:xsl=" >>>> http://www.w3.org/1999/XSL/Transform" >>>> xmlns:xs="http://www.w3.org/2001/XMLSchema"> >>>> <xsl:output omit-xml-declaration="yes" indent="yes"/> >>>> <xsl:strip-space elements="*"/> >>>> >>>> <xsl:variable name="vElemNames" select= >>>> "doc('midas.xsd')/*/*/*/xs:element/@name/string()"/> >>>> >>>> <xsl:template match="node()|@*"> >>>> <xsl:copy> >>>> <xsl:apply-templates select="node()|@*"/> >>>> </xsl:copy> >>>> </xsl:template> >>>> >>>> <xsl:template match="field"> >>>> <xsl:variable name="vPos" select="position()"/> >>>> >>>> <xsl:element name="{$vElemNames[$vPos]}"> >>>> <xsl:apply-templates select="node()|@*"/> >>>> </xsl:element> >>>> </xsl:template> >>>> </xsl:stylesheet> >>>> >>>> when applied on the provided XML document: >>>> >>>> <midas> >>>> <issuerSummary> >>>> <field id="1">01</field> >>>> <field id="2">54631</field> >>>> <field id="3">VA</field> >>>> <field id="4">11512</field> >>>> <field id="5">04222016</field> >>>> </issuerSummary> >>>> </midas> >>>> >>>> and referencing the provided XSD file (midas.xsd): >>>> >>>> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >>>> xmlns="urn:midas" targetNamespace="urn:midas" >>>> elementFormDefault="qualified"> >>>> <xs:complexType name="IssuerSummaryType"> >>>> <xs:sequence> >>>> <xs:element name="recordCode"> >>>> <xs:simpleType> >>>> <xs:restriction base="Text2Type"> >>>> <xs:enumeration value="01"/> >>>> </xs:restriction> >>>> </xs:simpleType> >>>> </xs:element> >>>> <xs:element name="tradingPartner" type="TradingPartnerType"/> >>>> <xs:element name="issuerStateCode" type="Text2Type"/> >>>> <xs:element name="HIOSid" type="HIOSIDType"/> >>>> <xs:element name="issuerExtractDate" type="xs:date"/> >>>> </xs:sequence> >>>> </xs:complexType> >>>> </xs:schema> >>>> >>>> produces (what I guess is) the wanted, correct result: >>>> >>>> <midas> >>>> <issuerSummary> >>>> <recordCode id="1">01</recordCode> >>>> <tradingPartner id="2">54631</tradingPartner> >>>> <issuerStateCode id="3">VA</issuerStateCode> >>>> <HIOSid id="4">11512</HIOSid> >>>> <issuerExtractDate id="5">04222016</issuerExtractDate> >>>> </issuerSummary> >>>> </midas> >>>> >>>> >>> Yes that is the correct result - my apologies for not making that >>> explicit and thank you for your answer and the problem you posted works as >>> you designed it on my setup. >>> >>> However I cannot do a straight transcription because the full problem is >>> more complex than posted. The schema actually has several complexTypes so >>> putting all the xs:element/@name in a variable will not work. Let me pose >>> this a different way by focusing on the field template below. >>> >>> <xsl:template match="field"> >>> <xsl:param name="recordType"/> >>> <xsl:variable name="vPos" select="position()"/> >>> <field> >>> <xsl:value-of >>> select="$recordType/xs:element[$pos]/@name/string()"/> >>> </field> >>> </xsl:template> >>> >>> Suppose I have the above where the param recordType contains the parent >>> xs:sequence of the correct set of xs:elements. So in this instance >>> $recordType contains >>> >>> <xs:sequence> >>> <xs:element name="recordCode"> >>> <xs:simpleType> >>> <xs:restriction base="Text2Type"> >>> <xs:enumeration value="01"/> >>> </xs:restriction> >>> </xs:simpleType> >>> </xs:element> >>> <xs:element name="tradingPartner" type="TradingPartnerType"/> >>> <xs:element name="issuerStateCode" type="Text2Type"/> >>> <xs:element name="HIOSid" type="HIOSIDType"/> >>> <xs:element name="issuerExtractDate" type="xs:date"/> >>> </xs:sequence> >>> >>> Above I have hardcoded the template to give me the 5th xs:element and >>> template obliges by naming all the elements issuerExtractDate and I get. >>> >>> <midas> >>> <issuerSummary> >>> <field>recordCode</field> >>> <field>tradingPartner</field> >>> <field>issuerStateCode</field> >>> <field>HIOSid</field> >>> <field>issuerExtractDate</field> >>> </issuerSummary> >>> </midas> >>> >>> So the correct fields are being picked up and everything works when the >>> field names are treated as data. >>> >>> So all I have to do now is to make the element names the content of the >>> field elements. >>> >>> But if I move the exact same expression from the value-of into the AVT >>> of the name attribute of xs:element like so >>> >>> <xsl:template match="field"> >>> <xsl:param name="recordType"/> >>> <xsl:variable name="pos" select="position()"/> >>> <xsl:element name="{$recordType/xs:element[$pos]/@name/string()}"> >>> <xsl:apply-templates/> >>> </xsl:element> >>> </xsl:template> >>> >>> I get XTDE0820: Supplied element name is a zero-length string. >>> >>> So what I really need to know is why that happens. >>> >>> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >>> EasyUnsubscribe <http://-list/1005724> (by email) >>> >> >> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >> EasyUnsubscribe <http://-list/1005724> (by email) >> > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <-list/601651> (by > email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Really want a zipper, Ihe Onwuka ihe.onwuk | Thread | [no subject], Unknown |
Re: [xsl] Really want a zipper, Ihe Onwuka ihe.onwuk | Date | Re: [xsl] Community Conversion, Eliot Kimber ekimber |
Month |