Mapper XPath-Injection

Heute war ich auf der Suche nach einer Möglichkeit, die Existenz mehrerer Unterelemente festzustellen. Mit vielen vereinzelten Existence-Abfragen würde das sicherlich funktionieren, aber es handelt sich um ein weit verzweigtes XML-Dokument. Zudem sollte es an mehreren Stellen mit unterschiedlichen Elementen funktionieren - es damit musste eine andere Möglichkeit gefunden werden, als eine ganze Existence-Batterie oder das Scripting-Funcoid.

Mein erster Versuch galt dem Mapping-Format. Ich hab probiert, die Link Source-Eigenschaft des Links direkt zu ändern, aber beim nochmaligen Öffnen des Mappings wird diese Änderung einfach ignoriert…

Danach hab ich es noch mit einem Custom Fuctoid versucht, kam hier aber leider auch nicht weiter, da diesem immer nur der Text der zugewiesenen Node übergeben wird, jeddoch nicht das XML-Dokument und/oder die dazugehörige XPath-Expression.

Nach mehrmaligem hin- und her kam mir dann die Idee, die XPath-Expression direkt in das Existence-Functoid einzutragen. Dies scheiterte leider auch, jeddoch konnte man im generierten XSLT-Dokument leicht erkennen, warum dies so war. Dort wird folgende Funktion ausgeführt.

1
userCSharp:LogicalExistence("count(/*[local-name()='Root_in']/*[local-name()='Child3'])>0")

Die Anführungsstriche sind natürlich nicht gewollt. Um diese zu umgehen kann man einfach (wie bei erfolgreicher SQL-Injection) die select-expression “umbiegen”. Verwendet man

1
true") and **count(/*[local-name()='Root_in']/*[local-name()='Child3'])>0 **and ("true

als erstes und einziges Argument. so wird aus obiger Anweisung

1
userCSharp:LogicalExistence("true") and count(/*[local-name()='Root_in']/*[local-name()='Child3'])>0 and ("true")

Und damit funktioniert es wie vorgesehen. Innerhalb der count-Anweisung kann eine beliebige XPath-Anweisung stehen. Schade nur, dass man die Link Source-Eigenschaft nicht direkt ändern kann - wäre wesentlich einfacher und leichter nachvollziehbar gewesen…