xsl: выберите найти первую позицию элементов, но не вторую - PullRequest
0 голосов
/ 14 мая 2018

Я хотел бы написать код XSLT для преобразования документа XML в документ XML-FO, чтобы сгенерировать PDF.

Это изображение показывает токовый выход

Итак, моя таблица имеет 3 столбца. В первых 4 строках второй и третий столбцы объединены.

Мой XML-документ выглядит так:

<WS-Standards>
    <tags>
        <tag  category = "parameters" > <!-- WS_Beer_Type -->
            <tag_name>WS_Beer_TypeX</tag_name> <!-- browsename -->
            <tag_number>30004</tag_number>
            <datatype>Unsigned32</datatype>
            <accessrights>RW</accessrights>
            <names>
                <name language="DE">Biersorte</name>
                <name language="EN">Beer Type</name>
            </names>
        </tag>

    </tags>
</WS-Standards>

Мой текущий документ XSLT:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" indent="yes"/>
    <xsl:template match="WS-Standards">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>
                <fo:simple-page-master page-height="297mm" page-width="210mm"
                    margin="5mm 25mm 5mm 25mm" master-name="PageMaster">
                    <fo:region-body margin="20mm 0mm 20mm 0mm"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="PageMaster">
                <fo:flow flow-name="xsl-region-body">
                    <fo:block>
                        <xsl:apply-templates select="tags"/>
                    </fo:block>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
    <xsl:template match="tags">
        <fo:block>
            <xsl:apply-templates select="tag"/>
        </fo:block>
    </xsl:template>

    <xsl:template match="tag">
        <fo:block space-before="6pt" border-top="3pt solid green">
            <fo:table>
                <fo:table-column column-number="1" column-width="20%" border-style="solid"
                    border-width="1pt"/>
                <fo:table-column column-number="2" column-width="10%" border-style="solid"
                    border-width="1pt"/>
                <fo:table-column column-number="3" column-width="70%" border-style="solid"
                    border-width="1pt"/>
                <fo:table-body>
                    <xsl:apply-templates/>
                </fo:table-body>
            </fo:table>
        </fo:block>
    </xsl:template>

    <xsl:template match="tag_name">
        <fo:table-row>
            <fo:table-cell column-number="1" border="1pt solid black">
                <fo:block> Tag Name </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="2" number-columns-spanned="2" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="."/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="tag_number">
        <fo:table-row>
            <fo:table-cell column-number="1" border="1pt solid black">
                <fo:block> Tag-Nummer </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="2" number-columns-spanned="2" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="."/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="datatype">
        <fo:table-row>
            <fo:table-cell column-number="1" border="1pt solid black">
                <fo:block> Datentyp </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="2" number-columns-spanned="2" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="."/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="accessrights">
        <fo:table-row>
            <fo:table-cell column-number="1" border="1pt solid black">
                <fo:block> Zugriffsrechte </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="2" number-columns-spanned="2" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="."/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="names">
        <xsl:choose>
            <xsl:when test="number(./name/position()) = 1">
                <fo:table-row>
                    <fo:table-cell column-number="1" border="1pt solid black">
                        <fo:block> Name </fo:block>
                    </fo:table-cell>
                    <fo:table-cell column-number="2" border="1pt solid black">
                        <fo:block>
                            <xsl:value-of select="./name/@language"/>
                        </fo:block>
                    </fo:table-cell>
                    <fo:table-cell column-number="3" border="1pt solid black">
                        <fo:block>
                            <xsl:value-of select="./name"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </xsl:when>
            <xsl:otherwise>
                <fo:table-row>
                    <fo:table-cell column-number="1" border="1pt solid black">
                        <fo:block> NameXXX </fo:block>
                    </fo:table-cell>
                    <fo:table-cell column-number="2" border="1pt solid black">
                        <fo:block>
                            <xsl:value-of select="./name/@language"/>
                        </fo:block>
                    </fo:table-cell>
                    <fo:table-cell column-number="3" border="1pt solid black">
                        <fo:block>
                            <xsl:value-of select="./name"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
    <xsl:template match="p">
        <fo:block>
            <xsl:apply-templates/>
        </fo:block>
    </xsl:template>
    <xsl:template match="b">
        <fo:inline font-weight="bold">
            <xsl:apply-templates/>
        </fo:inline>
    </xsl:template>
</xsl:stylesheet>

Мой вопрос об элементе names для разных языков.

Итак, первая строка в таблице элемента names выглядит следующим образом:

-----------------------------
|Name   | DE | Biersorte    |
-----------------------------

Но мне не хватает второй строки:

-----------------------------
|       | EN | beer type    |
-----------------------------

Что я делаю не так с функцией xsl: choose-> when-> else?

Я был бы рад совету.

1 Ответ

0 голосов
/ 14 мая 2018

Соответствующий код находится в шаблоне, соответствующем names, но в вашем XSLT есть только один такой элемент, поэтому он будет вызываться только один раз.

Выражение number(./name/position()) = 1 в этом контексте простоспрашивая «Для этого names элемента, есть ли элемент name в позиции 1», что верно, и поэтому xsl:when выполняется.

Ваш код действительно должен находиться в блоке, гдеname выбран.Попробуйте этот XSLT (который также удаляет дублирование кода).

<xsl:template match="names">
    <xsl:for-each select="name">
        <fo:table-row>
            <fo:table-cell column-number="1" border="1pt solid black">
                <fo:block> 
                    <xsl:if test="position() = 1">Name</xsl:if>
                </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="2" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="@language"/>
                </fo:block>
            </fo:table-cell>
            <fo:table-cell column-number="3" border="1pt solid black">
                <fo:block>
                    <xsl:value-of select="."/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:for-each>
</xsl:template>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...