Получение имени дочернего узла XML с использованием XSL - PullRequest
2 голосов
/ 18 февраля 2010

У меня есть программа XML в следующей структуре

<Part>
     <ID>1</ID>
     <Density>3</Density>
     <Parameter>
           <Element>Alloy</Element>
     </Parameter>
</Part>

Я хочу создать XSL, который преобразует этот XML таким образом, что

ID 1
Density 3
Element Alloy

Как я могу это сделать ?? Кто-нибудь может помочь мне с этим ...

Ответы [ 5 ]

3 голосов
/ 19 февраля 2010

Более короткое преобразование, иллюстрирующее несколько удобных приемов для такого рода вещей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:strip-space elements="*"/>    
<xsl:variable name="newline"><xsl:text>
</xsl:text></xsl:variable>

<xsl:template match="text()">
  <xsl:value-of select="concat(local-name(..),' ',normalize-space(.),$newline)"/>
</xsl:template>

</xsl:stylesheet>
  • strip-space говорит, что игнорировать все узлы только пробела.
  • Youможет давать параметры таким функциям, как local-name.
  • При генерации текстового вывода часто полезна переменная типа $ newline.

При желании добавление следующего преобразования игнорирует все неконечныетекстовые узлы:

<xsl:template match="*[*]"><xsl:apply-templates/></xsl:template>
3 голосов
/ 18 февраля 2010

Вы не указываете желаемый тип вывода, но я догадываюсь, что HTML не значит, что могут использоваться те же принципы Я также собираюсь догадаться, что элемент Parameter может содержать множество элементов с разными именами тегов.

Вот тогда преобразование: -

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />

    <xsl:template match="Part">
        <html>
            <div>
                <xsl:text>ID </xsl:text>
                <xsl:value-of select="ID" />
            </div>
            <div>
                <xsl:text>Density </xsl:text>
                <xsl:value-of select="Density" />
            </div>
            <xsl:for-each select="Parameter/*">
                <div>
                    <xsl:value-of select="name()" />
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="." />
                </div>
            </xsl:for-each>
        </html>
    </xsl:template>

</xsl:stylesheet>
2 голосов
/ 19 февраля 2010

В качестве альтернативы коду Лахлана вы также можете попробовать

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />

<xsl:template match="text()">
  <xsl:if test="normalize-space(.)">
    <xsl:value-of select="local-name(parent::*)" />
    <xsl:text> </xsl:text>
    <xsl:value-of select="normalize-space(.)" />
    <xsl:text>
</xsl:text>
  </xsl:if>
</xsl:template>

</xsl:stylesheet>
2 голосов
/ 18 февраля 2010

В этом примере отображается имя и текстовое содержимое этих элементов без дочерних элементов.

Выход имеет следующие особенности:

  • использует local-name (), чтобы избежать вывода префиксов пространства имен, например, для <xsl:text/> это "текст"
  • использует normalize-space () для удаления начальных и конечных пробелов, а также для сжатия последовательностей внутренних пробелов
  • xsl: полоса-пробел, чтобы игнорировать только пробельный текстовый узел во входных данных
  • CRLF, конец строки
  • метод вывода текста

Пример кода:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="text" />
    <xsl:strip-space elements="*" />

    <xsl:template match="*[not(*)]">
        <xsl:value-of select="local-name()" />
        <xsl:text> </xsl:text>
        <xsl:value-of select="normalize-space(.)" />
        <xsl:text>&#10;&#13;</xsl:text>
    </xsl:template>

</xsl:stylesheet>
1 голос
/ 18 февраля 2010

Вам нужно посмотреть на функцию name ().

<xsl:value-of select="name()"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...