XSLT - активировать функцию xpath в XSLT - PullRequest
1 голос
/ 12 октября 2009

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

<?xml version="1.0" encoding="UTF-8"?>
<toc xmlns:fn="http://www.w3.org/2004/07/xpath-functions" label="Sample Table of Contents">
    <topic label="Title1" href="Ref1#ref1">
        <topic label="Title 2" href="Ref2#ref2">
            <topic label="Title3" href="Ref3#ref3"/>
            <topic label="Title4" href="Ref4#ref4"/>
        </topic>
        <topic label="Title5" href="Ref5#ref5"/>
    </topic>
    <topic label="Title6" href="Ref6#ref6"/>
</toc>

и следующий XSLT, который создает этот xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="D:\Documents and Settings\oshecht\Desktop\XSL\Copy of toc.xml"?>
<?altova_samplexml D:\Documents and Settings\oshecht\Desktop\XSL\Copy of toc.xml?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2004/07/xpath-functions">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="BODY">
        <toc label="Sample Table of Contents">
            <xsl:apply-templates select="UL/LI/OBJECT"/>
        </toc>
    </xsl:template>
    <xsl:template match="OBJECT">
        <topic label="{param[@name='Name']/@value}" href="{param[@name='Local']/@value}">
            <xsl:apply-templates select="following-sibling::UL/LI/OBJECT"/>
        </topic>
    </xsl:template>
</xsl:stylesheet>

Я хочу, чтобы в выходном XML я имел:

Следующее:

- та же строка, но вместо href = "Ref1 # ref1" иметь:

href = "Ref1" - удалить все после "#"

я знаю о функции substring-before (Ref1 # ref1, '#'), но как я могу активировать ее из моего XSLT?

Не могли бы вы посоветовать?

1 Ответ

0 голосов
/ 12 октября 2009

Вы можете обернуть выражение XPATH, выбрав @value внутри шаблона значения атрибута для @href, что даст результат вызова функции для значения @href:

<xsl:template match="OBJECT">
    <topic label="{param[@name='Name']/@value}" href="{substring-before(param[@name='Local']/@value, '#')}">
            <xsl:apply-templates select="following-sibling::UL/LI/OBJECT"/>
    </topic>
</xsl:template>

Если шаблон значения атрибута сбивает с толку, вы также можете выделить атрибут @href следующим образом:

<xsl:template match="OBJECT">
    <topic label="{param[@name='Name']/@value}">
            <xsl:attribute name="href">
               <xsl:value-of select="substring-before(param[@name='Local']/@value, '#')" />
            </xsl:attribute>
            <xsl:apply-templates select="following-sibling::UL/LI/OBJECT"/>
    </topic>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...