Reputation: 161
I have an xml, which is the merged output of several subsystem queries. Now I must pick a lot of informations. For example:
/Merge/response/BenutzerDaten/Deaktiviert
If /Merge/response/results/result/dn ends with ",o=test,c=de" and there is only one result ending with the pattern:
/Merge/response/results/result/attributes/identnummer
If /Merge/response/results/result/dn ends with ",DC=TEST,DC=DE":
/Merge/response/results/result/attributes/postalCode
Whats the best way to do this?
Here is a reduced sample of my soure xml:
<?xml version="1.0" encoding="UTF-8"?>
<Merge>
<response>
<results>
<result>
<dn>cn=user1,ou=members,ou=group1,o=test,c=de</dn>
<attributes>
<identnummer>re3232</identnummer>
<uid>user1</uid>
[...]
<adminuid>admin3</adminuid>
</attributes>
</result>
</results>
</response>
<response>
<results>
<result>
<dn>CN=user1,OU=Users,DC=TEST,DC=DE</dn>
<attributes>
<postalCode>12345</postalCode>
<company>My Company</company>
[...]
<streetAddress>XSLT Road 1</streetAddress>
</attributes>
</result>
</results>
</response>
<response>
<secDN>principalName=user1,cn=Users,secDomain=Default</secDN>
<Benutzerdaten>
<Deaktiviert>false</Deaktiviert>
<Gesperrt>false</Gesperrt>
[...]
<PasswortGueltig>true</PasswortGueltig>
</Benutzerdaten>
</response>
<Nutzdaten>
<Identifikation>
<AdminID>admin3</AdminID>
<BenutzerID>user1</BenutzerID>
</Identifikation>
<Benutzerdaten>
<Datentyp>Account-Daten</Datentyp>
<Datentyp>Anwendungs-Daten</Datentyp>
<Datentyp>Benutzer-Daten</Datentyp>
</Benutzerdaten>
</Nutzdaten>
</Merge>
The expected result should look like:
<?xml version="1.0" encoding="UTF-8"?>
<UserData>
<user>user1</user>
<source1>
<identnummer>re3232</identnummer>
</source1>
<source2>
<postalCode>12345</postalCode>
</source2>
<source3>
<Deaktiviert>false</Deaktiviert>
</source3>
</UserData>
And here is my unsuccessful try:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:choose>
<xsl:when test="/Merge/response/Benutzerdaten and count(/Merge/response/results/result[dn = '*,o=test,c=de') = 1" and count(/Merge/response/results/result[dn = '*,DC=TEST,DC=DE') = 1" >
<UserData>
<user>
<xsl:value-of select="/Merge/Nutzdaten/Identifikation/BenutzerID"/>
</user>
<xsl:if test="/Merge/response/Benutzerdaten/*">
<Account>
<xsl:copy-of select="/Merge/response/Benutzerdaten/*"/>
</Account>
</xsl:if>
<xsl:if test="substring(/Merge/response/results/result/dn, string-length(/Merge/response/results/result/dn) -11) = ',o=test,c=de'">
<source1>
<postalCode>
<xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
</postalCode>
</source1>
</xsl:if>
<xsl:if test="substring(/Merge/response/results/result/dn, string-length(/Merge/response/results/result/dn) -12) = ',DC=TEST,DC=DE'">
<source2>
<postalCode>
<xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
</postalCode>
</source2>
</xsl:if>
<source3>
<Deaktiviert>
<xsl:value-of select="/Merge/response/BenutzerDaten/Deaktiviert"></xsl:value-of>
</Deaktiviert>
</source3>
</UserData>
</xsl:when>
<xsl:otherwise>
<response>
<failure>
<xsl:choose>
<xsl:when test="count(/Merge/response/results/result[dn = '*,o=test,c=de') > 1">
<message>more than one result from source1</message>
</xsl:when>
<xsl:otherwise>
<message>The requested object does not exist.</message>
</xsl:otherwise>
</xsl:choose>
</failure>
</response>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Upvotes: 0
Views: 68
Reputation: 16
Try the below:
<xsl:param name="text" select="/Merge/response/results/result/dn[contains(text(),'o=test,c=de')]"/>
<xsl:param name="text1" select="/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]"/>
<xsl:choose>
<xsl:when test="/Merge/response/Benutzerdaten and count(/Merge/response/results/result/dn [contains(text(),'o=test,c=de')]) = 1 and count(/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]) = 1" >
<UserData>
<user>
<xsl:value-of select="/Merge/Nutzdaten/Identifikation/BenutzerID"/>
</user>
<xsl:if test="/Merge/response/Benutzerdaten/*">
<Account>
<xsl:copy-of select="/Merge/response/Benutzerdaten/*"/>
</Account>
</xsl:if>
<xsl:if test="substring($text, string-length($text)-11)">
<source1>
<postalCode>
<xsl:value-of select="/Merge/response/results/result/attributes/portalCode"></xsl:value-of>
</postalCode>
</source1>
</xsl:if>
<xsl:if test="substring($text, string-length($text)-12)">
<source2>
<postalCode>
<xsl:value-of select="/Merge/response/results/result/attributes/postalCode"></xsl:value-of>
</postalCode>
</source2>
</xsl:if>
<source3>
<Deaktiviert>
<xsl:value-of select="/Merge/response/Benutzerdaten/Deaktiviert"></xsl:value-of>
</Deaktiviert>
</source3>
</UserData>
</xsl:when>
<xsl:otherwise>
<response>
<failure>
<xsl:choose>
<xsl:when test="count(/Merge/response/results/result/dn[contains(text(),'o=test,c=de')]) > 1">
<message>more than one result from source1</message>
</xsl:when>
<xsl:when test="count(/Merge/response/results/result/dn[contains(text(),'DC=TEST,DC=DE')]) > 1">
<message>more than one result from source2</message>
</xsl:when>
<xsl:otherwise>
<message>The requested object does not exist.</message>
</xsl:otherwise>
</xsl:choose>
</failure>
</response>
</xsl:otherwise>
</xsl:choose>
Upvotes: 0