Я ломал голову над этим, но, похоже, не могу понять это правильно, и я не подбираю правильные ключевые слова в Google ..
Я недавно начал играть с XSLT и XPath, чтобы создать XML-описание глоссариев на естественном языке - для моего проекта.
Проблема в том, что я решил использовать сложные элементы «смешанный контент» для некоторых слов, а в некоторых случаях хочу получить только текстовый узел.
Вот часть документа XML:
...
<entry category="substantiv">
<word lang="sv">semester</word>
<word lang="de">
<article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
</entry>
...
В моем документе много элементов entry, и в этом случае я хочу получить Urlaub, используя: /entry/word[@lang='de']/text()
, что из-за моих разрывов строк не сработает. Я обнаружил, что на самом деле есть три текстовых узла .. .../text()[2]
, конечно, будет работать .. Однако я заранее не знаю, где будут разрывы строк или сколько. Если xml отформатирован, как показано ниже, моя первая версия пути будет работать, но не вторая:
...
<word lang="de"><article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
...
То, что я хочу сделать, это выделить все непосредственные текстовые узлы слова [@ lang = 'de'], а затем удалить ненужные пробелы, используя normalize-space()
. Тем не менее, как мне сделать это с помощью XPath? Или есть лучший способ? Кажется, это было бы легко, но я не могу понять это. Кстати, я пытаюсь сделать это в документе XSLT.
normalize-space(/entry/word[@lang='de']/text()[*])
- это одна из вещей, которые я пробовал, но, похоже, это делает что-то другое.
/ Благодарен за любую помощь.
Обновление:
Вот часть XSLT согласно запросу:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:value-of select="normalize-space(word[@lang='de']/text()[2])" />
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
Этот код прекрасно работает с первой версией форматирования. Чтобы прояснить, что я хочу сделать, это получить значение текстового узла в сложном элементе <word lang="de">
, несмотря на то, что оно может быть отформатировано с помощью разрывов строк и пробелов. То, что я буду делать со значением, зависит от контекста, но сейчас я просто помещу его в документ в формате xhtml.
Update2:
Сейчас я использую <xsl:strip-space elements="*"/>
, что устраняет проблему наличия пустых текстовых узлов. Я также использую:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(word[@lang='de']/text())" />
<xsl:text>, </xsl:text>
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
Тем не менее придется нормализовать, так как пробел все еще добавляется после "Urlaub" в XML.
Когда мне нужно добраться до текстового узла «Urlaub» за пределами используемого документа XSLT:
<xsl:value-of select="normalize-space(word[@lang='de']/text()[normalize-space() != ''])" />
Спасибо всем за помощь, ребята!
Обновление 3:
Пытался улучшить заголовок