Hallo Community,
ich versuche gerade die FS_ID des Typs eines Links innerhalb eines CMS_INPUT_DOM per Skript auszulesen. Das geht (so meine Vermutung) am einfachsten per XPath, da der Inhalt des DOMs eine XML-Struktur ist:
<DOM>
<p_story>
<CMS_LINK linktemplate="embedded_teaser" type="genericlink">
<TEMPLATECONTENT>
<CMS_VALUE name="lt_teaserFormat">
<LANG id="$" set="1">
<SEL>
<VALUE>427</VALUE>
</SEL>
</LANG>
</CMS_VALUE>
<CMS_VALUE name="lt_story">
<LANG id="$" set="1" />
</CMS_VALUE>
<CMS_VALUE name="lt_embeddableFormat">
<LANG id="$" set="1" />
</CMS_VALUE>
<CMS_VALUE name="lt_embeddedElementCaption">
<LANG id="$" set="1">
<TEXT>Step 1: New Kids auf alten Bildern</TEXT>
</LANG>
</CMS_VALUE>
<CMS_VALUE name="lt_embeddedElementAlignment">
<LANG id="$" set="1">
<SEL>
<VALUE>centered</VALUE>
</SEL>
</LANG>
</CMS_VALUE>
</TEMPLATECONTENT>
</CMS_LINK>
</p_story>
[...]
</DOM>
Ich möchte nun genau die "427" herausfiltern. Hierfür habe ich mir das DOM-XML gespeichert und in Firefox mit AddOn "XmlUtil" geöffnet, da es damit möglich ist einen XPath-Ausdruck für eine bestimmte Node zu generieren.
Dieser XPath-Ausdruck lautet:
/DOM/p_story/CMS_LINK[@linktemplate='embedded_teaser' and @type='genericlink']/TEMPLATECONTENT/CMS_VALUE[@name='lt_teaserFormat']/LANG[@id='§' and @set='1']/SEL/VALUE
oder gekürzt
//CMS_LINK[@linktemplate='embedded_teaser']/TEMPLATECONTENT/CMS_VALUE[@name='lt_teaserFormat']/LANG/SEL/VALUE
Damit sollte es eigentlich möglich sein auf dem Rootnode des DOMs den entsprechenden Node herauszufiltern. Man kann noch die Methode text() anhängen, aber die Node würde mir schon reichen.
Jetzt zum Verhalten von FirstSpirit:
In einer Beanshell-Console suche ich mir das Entity mit dem DOM-Text
story = e.schema.session.find("stories", 1111);
dom = e.getDataset(story).getFormData().get(null, "cs_mainText").get().get();
xpathString = "//CMS_LINK[@linktemplate='embedded_teaser']/TEMPLATECONTENT/CMS_VALUE[@name='lt_teaserFormat']/LANG/SEL/VALUE";
xpath = javax.xml.xpath.XPathFactory.newInstance().newXPath();
xpath.evaluate(xpathString, dom, javax.xml.xpath.XPathConstants.NODE);
Ich erwartete hier eigentlich, dass nun die gewünschte Node rauspurzelt. Stattdessen erhalte ich "null". Baue ich sukzessive den XPath-Ausdruck zurück, erhalte ich in egal welcher Kombination immer "null". Einzig folgender Ausdruck scheint zu funktionieren:
//CMS_LINK
Hier bekomme ich die CMS_LINK-Node. Hangele ich mich nun mittels node.getFirstChild()-Methode durch die einzelnen Nodes, dann bekomme ich genau die erwarteten geliefert, die XPath in FirstSpirit aber wehement nicht finden will:
bsh % node = xpath.evaluate("//CMS_LINK", dom, javax.xml.xpath.XPathConstants.NODE);
<[CMS_LINK: null]>
bsh % node.getFirstChild();
<[TEMPLATECONTENT: null]>
bsh % node.getFirstChild().getFirstChild();
<[CMS_VALUE: null]>
bsh % node.getFirstChild().getFirstChild().getAttribute("name");
<lt_teaserFormat>
bsh % node.getFirstChild().getFirstChild().getFirstChild();
<[LANG: null]>
bsh % node.getFirstChild().getFirstChild().getFirstChild().getFirstChild();
<[SEL: null]>
bsh % node.getFirstChild().getFirstChild().getFirstChild().getFirstChild().getFirstChild();
<[VALUE: null]>
bsh % node.getFirstChild().getFirstChild().getFirstChild().getFirstChild().getFirstChild().getTextContent();
<427>
Nicht einmal der XPath-Ausdruck
//CMS_LINK/TEMPLATECONTENT
wird gefunden.
WTF?!