Как получить требуемое значение тега из XML-файла в файле .xsl? - PullRequest
2 голосов
/ 11 мая 2011

У меня следующий тип файла содержится в формате xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <serviceImpl category="default">
        <package>esterMemoryManagement</package>
        <service singleton="true">
            <provides>xoc.hw.cor.memgt.ZContentType</provides>
            <brief>This sis first sdrevice</brief>
        </service>
    </serviceImpl>
    <serviceImpl category="default">
        <package>w.cor.TesterM</package>
        <service singleton="true">
            <provides>xoc.hw.ZAccessTypeProvid</provides>
            <brief>This sis first sdrevice</brief>
        </service>
    </serviceImpl>
</root>

Мне нужно получить все значения в теге <provides></provides> в файле .xsl. Как я могу это сделать? Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Вот краткое и полное решение :

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

 <xsl:template match="provides">
  <xsl:value-of select="concat(.,'&#xA;')"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML:

<root>
    <serviceImpl category="default">
        <package>esterMemoryManagement</package>
        <service singleton="true">
            <provides>xoc.hw.cor.memgt.ZContentType</provides>
            <brief>This sis first sdrevice</brief>
        </service>
    </serviceImpl>
    <serviceImpl category="default">
        <package>w.cor.TesterM</package>
        <service singleton="true">
            <provides>xoc.hw.ZAccessTypeProvid</provides>
            <brief>This sis first sdrevice</brief>
        </service>
    </serviceImpl>
</root>

желаемый, правильный результат получается :

xoc.hw.cor.memgt.ZContentType
xoc.hw.ZAccessTypeProvid

Пояснение :

  1. Единственныйшаблон, который выдает результат: , соответствующий provides.

  2. Второй шаблон соответствует любому текстовому узлу и имеет пустое тело , которое эффективно переопределяетвстроенный шаблон XSLT для текстовых узлов и предотвращает («удаляет») любой сопоставленный текстовый узел от вывода (действие, которое в противном случае было бы выполнено встроенным шаблоном XSLT).

0 голосов
/ 11 мая 2011

Вы можете использовать XSL для фильтрации значений, таких как:

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

  <xsl:output method="text"/>

  <xsl:template match="/">
    <xsl:apply-templates select="//serviceImpl/provides" />
  </xsl:template>

  <xsl:template match="serviceImpl/provides">
    <xsl:value-of select="text()" />
    <xsl:text>&#x0A;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

(кстати, ваш пример XML не во всех местах корректен)

0 голосов
/ 11 мая 2011

Вот один из способов сделать это:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">

    <xsl:output method="text"/>

    <xsl:template match="root">
        <xsl:apply-templates select="serviceImpl"/>
    </xsl:template>

    <xsl:template match="serviceImpl">
        <xsl:apply-templates select="service"/>
        <xsl:text>,</xsl:text>
    </xsl:template>

    <xsl:template match="service">
        <xsl:apply-templates select="provides"/>
    </xsl:template>

    <xsl:template match="provides">
        <xsl:value-of select="."/>
    </xsl:template>

</xsl:stylesheet>

Вы также можете захотеть взглянуть на этот вопрос и соответствующие ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...