Комплексное использование подстрок в XSLT - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть блок кода XML, который реализует атрибуты о семействе:

<?xml version="1.0" encoding="UTF-8"?>    
<family>
    <familySurname>Smith</familySurname>
        <biography firstName="John">
            <family position="dad">1</family>
            <family information="name">Smith_John (123)</family>
        </biography>
        <biography firstName="Jane">
            <family position="mom">2</family>
            <family information="name">Smith_Jane (456)</family>
        </biography>
        <biography firstName="Kelsey">
            <family position="daughter">3</family>
            <family information="name">Smith_Kelsey (789)</family>
        </biography>
</family>

Я надеюсь написать код XSL, который выведет следующее:

Smith 123 John
Smith 456 Jane
Smith 789 Kelsey

У меня есть бит фиксированной ширины (я написал функцию для этого), так что я хорошо пойду туда.Тем не менее, я зациклен на том, как сохранить элемент familySurname постоянным, в то же время просматривая и подстегивая каждый из атрибутов family @information.

Может ли кто-нибудь помочь мне логически обработать это в XSL?Я совершенно новый для языка.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я не понимаю, почему вам нужно "пробежаться и подстроковать каждый из атрибутов семейства @information", когда вы можете извлечь все из них, кроме того, что в скобках, из соответствующих мест:

<xsl:template match="family">
    <xsl:variable name="surname" select="familySurname" />
    <xsl:for-each select="biography">
        <xsl:value-of select="$surname"/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="substring-before(substring-after(family[@information='name'], '('), ')') "/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@firstName"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>
0 голосов
/ 21 декабря 2018

Вы можете использовать эти три шаблона.Первый пропускает вывод familySurname, второй просто пропускает элементы family, а третий форматирует вывод.

<xsl:template match="familySurname" />

<xsl:template match="family">
    <xsl:apply-templates />
</xsl:template>

<xsl:template match="biography">
    <xsl:variable name="str"       select="family[@information='name']" />
    <xsl:variable name="lastName"  select="substring-before($str,'_')" />
    <xsl:variable name="firstName" select="substring-before(substring-after($str,'_'),' ')" />
    <xsl:variable name="index"     select="substring-before(substring-after($str,'('),')')" />
    <xsl:value-of select="concat($lastName,' ',$index,' ',$firstName)" />
</xsl:template>

Вывод:

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