XSLT - заставить xsl: analy-string возвращать строку вместо последовательности строк? - PullRequest
0 голосов
/ 22 марта 2012

Можно ли заставить xsl:analyze-string возвращать одну строку вместо последовательности строк?

Справочная информация: я хотел бы использовать xsl:analyze-string в xsl:function, который должен инкапсулировать сопоставление с образцом. В идеале функция должна возвращать xs:string для использования в качестве критерия сортировки в элементе xsl:sort.

На данный момент мне нужно применить string-join () к каждому результату вызова функции, поскольку xsl:analyze-string возвращает последовательность строк, а xsl:sort не принимать такую ​​последовательность в качестве критерия сортировки. Смотрите строку 24 таблицы стилей:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="www.my-personal-namespa.ce"
        xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xsl:output indent="yes" method="xml"  />

<xsl:function name="my:sortierung" >
    <xsl:param name="inputstring" as="xs:string"/>
    <xsl:analyze-string select="$inputstring" regex="[0-9]+">
        <xsl:matching-substring>
            <xsl:value-of select="format-number(number(.), '00000')" />
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>
    </xsl:analyze-string>
</xsl:function>

<xsl:template match="/input">
    <result>
    <xsl:apply-templates select="value" >
        <xsl:sort select="string-join((my:sortierung(.)), ' ')" />
        </xsl:apply-templates>
    </result>
</xsl:template>

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

с этим входом:

<?xml version="1.0" encoding="UTF-8"?>
<input>
    <value>A 1 b 120</value>
    <value>A 1 b 1</value>
    <value>A 1 b 2</value>
    <value>A 1 b 1a</value> 
</input>

В моем примере, есть ли способ изменить функцию xsl: так, чтобы она возвращала строку xs: вместо последовательности?

1 Ответ

2 голосов
/ 22 марта 2012

Я думаю, что есть несколько способов: вы можете поместить результат analyze-string в переменную внутри функции и затем использовать xs:sequence select="string-join($var, ' ')" в функции.Однако следующее с xsl:value-of также должно быть:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="www.my-personal-namespa.ce"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        exclude-result-prefixes="my xs">

<xsl:output indent="yes" method="xml"  />

<xsl:function name="my:sortierung" as="xs:string">
    <xsl:param name="inputstring" as="xs:string"/>
    <xsl:value-of separator=" ">
    <xsl:analyze-string select="$inputstring" regex="[0-9]+">
        <xsl:matching-substring>
            <xsl:value-of select="format-number(number(.), '00000')" />
        </xsl:matching-substring>
        <xsl:non-matching-substring>
            <xsl:value-of select="." />
        </xsl:non-matching-substring>
    </xsl:analyze-string>
    </xsl:value-of>
</xsl:function>

<xsl:template match="/input">
    <result>
    <xsl:apply-templates select="value" >
        <xsl:sort select="my:sortierung(.)" />
        </xsl:apply-templates>
    </result>
</xsl:template>

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