Subject: Re: New XSLT NOT WORKING was Re: [xsl] XSLT to populate a SAML AttributeStatement from an XML From: "ohaya ohaya@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Sat, 21 Jan 2023 08:09:15 -0000 |
Hi, Please ignore the last part of what I said about having the "extraneous data" problem when I ran the XSLT with a larger XML that I have. That is not the case... I was misinterpreting what I was seeing as being the extranseous data, but in fact the problems that I am seeing when running the larger XML is exactly the same as the smaller example below. Basically, in both the example below, and in the larger test run I did, it looks like the XSLT is lumping the elements under each of the "branches" ("personnel", etc.) and making a <saml:Attribute> for each branch, and then putting all of the values for all of those elements under one saml:Attribute that has the name of the branch. Jim On Saturday, January 21, 2023, 01:57:20 AM EST, ohaya ohaya@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: I tried what Michael suggested, but it is not working correctly. Here's the XML file: <?xml version="1.0"?> <record> <adrRecord> <PN_ID>1111111</PN_ID> <personnel> <ADM_ORG_CD>urn:NORM:DEPT</ADM_ORG_CD> <DOD_ASSOC_CD>urn:NORM:V01</DOD_ASSOC_CD> </personnel> <enterpriseUser> <entUserRoles>a:b:c</entUserRoles> </enterpriseUser> </adrRecord> </record> Here's the XSLT I have now: <xsl:stylesheet version="1.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <saml:AttributeStatement> <!-- <xsl:apply-templates select="/record/adrRecord/*"/> --> <xsl:apply-templates/> </saml:AttributeStatement> </xsl:template> <!--<xsl:template match="text()|@*" mode="#all"/> --> <xsl:template match="text()"/> <xsl:template match="/record/adrRecord/*"> <saml:Attribute Name="{name()}" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <xsl:for-each select="tokenize(.,':')"> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string"><xsl:value-of select="."/></saml:AttributeValue> </xsl:for-each> </saml:Attribute> </xsl:template> </xsl:stylesheet> The output: <?xml version="1.0"?> <saml:AttributeStatement xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <saml:Attribute Name="PN_ID" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">1111111</saml:AttributeValue> </saml:Attribute> <saml:Attribute Name="personnel" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string"> urn</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">NORM</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">DEPT urn</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">NORM</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">V01 </saml:AttributeValue> </saml:Attribute> <saml:Attribute Name="enterpriseUser" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string"> a</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">b</saml:AttributeValue> <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">c </saml:AttributeValue> </saml:Attribute> </saml:AttributeStatement> It seems like it is picking up the path names instead of the element/node names? Also, FYI, I have another test with more/actual data, and that is also showing an additional problem... similar to previously, it is outputting a bunch of "extraneous data"... it is outputting a bunch of the attribute values, without any XML. My understanding from the earlier discussion about this problem is that this extraneous data is happening because of the "hidden XSLT", but I've tried several different thing to try to suppress that but neither have suppressed that data output: <xsl:template match="text()|@*" mode="#all"/> and: <xsl:template match="text()"/> I know that I am either misunderstanding something that Michael had said, or missing something :(... Thanks, Jim On Saturday, January 21, 2023, 12:14:33 AM EST, ohaya ohaya@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: Hi Michael (et al), You all might find this funny (== "ironic" or "amusing" ), but after showing some of my colleagues what I had done, they are now telling me (a) the names for each of the template matches ARE the same (exactly as you all ASSUMED earlier) plus they realized that if the XSLT designed to only work with specific names, then if the names in the source XML changed, then we would also have to change our code every time, so I think I am going to try to to use what you (Michael) originally suggested :)!! Jim On Wednesday, January 18, 2023, 01:56:45 PM EST, Michael Kay michaelkay90@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: Are you able to use XSLT 2.0+ -- that gives you a tokenize() function which makes this far easier. In 2.0 it's essentially <xsl:template match="personnel/*"> B <saml:Attribute Name="{name()}" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> B B <xsl:for-each select="tokenize(.)"> B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string"><xsl:value-of select="."/></saml:AttributeValue> Incidentally, there are no attributes in your input XML - it's all elements. Michael Kay Saxonica B > On 18 Jan 2023, at 17:06, ohaya ohaya@xxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > [I originally sent this to the wrong email address... sorry!] > > Hi, > > I have an application where I am retrieving a number of attributes and values from a web service, in the form of an XML file, and I want to create and populate a SAML AttributeStatement from the attributes and values in that XML file.B A couple of complications (to me): > > - The attribute names in the XML file are different than the corresponding attributes in the SAML AttributeStatement. > - Some of the attributes are multi-valued:B in the source XML file, the values are a colon-separated string (e.g. ab:cd:ef), but in the AttributeStatement, each value will be in separate <saml:Attribute> element. > > Here's an example source XML: > > <record> > . > . > . >B <adrRecord> >B B <PN_ID>1111111</PN_ID> >B B <personnel> >B B B <ADM_ORG_CD>urn:NORM:DEPT</ADM_ORG_CD> >B B B <DOD_ASSOC_CD>urn:NORM:V01</DOD_ASSOC_CD> >B B </personnel> >B </adrRecord> > </record> > > and the AttributeStatement I want to transform the above to is something like: > > >B B <saml:Attribute Name="MY_PN_ID" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">1111111</saml:AttributeValue> >B B </saml:Attribute> > > >B B <saml:Attribute Name="MY_ORG_CD" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">DEPT</saml:AttributeValue> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">urn</saml:AttributeValue> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">NORM</saml:AttributeValue> >B B </saml:Attribute> > > >B B <saml:Attribute Name="MY_ASSOC_CD" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:basic"> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">urn</saml:AttributeValue> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">NORM</saml:AttributeValue> >B B B B <saml:AttributeValue xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:string">V01</saml:AttributeValue> >B B </saml:Attribute> > > </saml:AttributeStatement> > > Can someone suggest the best approach to do this?B I actually would prefer to have a series of transforms to do this, rather than just a single XSLT, mainly so I can be able to see how things are working (or not working). > > Thanks, > Jim > > XSL-List info and archiveEasyUnsubscribe(by email) XSL-List info and archiveEasyUnsubscribe(by email)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
New XSLT NOT WORKING was Re: [xsl] , ohaya ohaya@xxxxxxxx | Thread | Re: New XSLT NOT WORKING was Re: [x, ohaya ohaya@xxxxxxxx |
New XSLT NOT WORKING was Re: [xsl] , ohaya ohaya@xxxxxxxx | Date | Re: New XSLT NOT WORKING was Re: [x, ohaya ohaya@xxxxxxxx |
Month |