XSLT Apply Templates, где дочерний элемент начинается с 'A' - PullRequest
0 голосов
/ 29 июня 2018

У меня есть структура xml, в основном так:

<Export>
<TaskWords>
    <TaskWord>
        <ID>1</ID>
        <WordType>A01</WordType>
        <Body>blah</body>
    </TaskWord>
    <TaskWord>
        <ID>2</ID>
        <WordType>A02</WordType>
        <Body>blah</body>
    </TaskWord>
    <TaskWord>
        <ID>3</ID>
        <WordType>B01</WordType>
        <Body>blah</body>
    </TaskWord>
    <TaskWord>
        <ID>4</ID>
        <WordType>B02</WordType>
        <Body>blah</body>
    </TaskWord>
</TaskWords>
</Export>

У меня также есть некоторый код XSLT, который применяет шаблон, который создает таблицу XHTML в TaskWords, сгруппированную по WordType.

Я хочу применить шаблон к подмножеству TaskWords, где, например, WordType начинается с 'A'; Это сделано для того, чтобы я мог поместить все WordTypes типа «A» в одну таблицу отчета, затем добавить еще какое-то содержимое из другого места, а затем создать таблицу со всеми WordTypes типа «B».

Я пытался звонить по следующим линиям безрезультатно:

<xsl:apply-templates select="TaskWords[TaskWord/WordType[starts-with(.,'A')]]"/> 
<xsl:apply-templates select="OtherContent"/>
<xsl:apply-templates select="TaskWords[TaskWord/WordType[starts-with(.,'B')]]"/> 

Я на правильном пути, пытаясь отфильтровать наборы TaskWords с помощью оператора select команды apply-templates? Любые советы, указатели или решения будут высоко оценены.

Ответы [ 4 ]

0 голосов
/ 02 июля 2018

Для других решение, которое я выбрал, было следующим:

<xsl:template match="/Export/TaskWords">            
        <table width="100%">
            <xsl:for-each-group select="TaskWord[starts-with(WordType,'A')]" group-by="WordType">
                <tr class="noborder">
                    <th colspan="2"><h2><xsl:value-of select="Title"/></h2></th>
                </tr>
                <xsl:apply-templates select="current-group()"/>
            </xsl:for-each-group>
        </table>

        <xsl:apply-templates select="/Export/TaskContents"/>

        <xsl:apply-templates select="/Export/Outputs"/>

        <table width="100%">
            <xsl:for-each-group select="TaskWord[starts-with(WordType,'B')]" group-by="WordType">
                <tr class="noborder">
                    <th colspan="2"><h2><xsl:value-of select="Title"/></h2></th>
                </tr>
                <xsl:apply-templates select="current-group()"/>
            </xsl:for-each-group>
        </table>
</xsl:template>

<xsl:template match="TaskWord">
    <xsl:for-each select="current-group()">
        <xsl:if test="Status='P'">
            <tr>
                <td class="leftcol"><h3><xsl:value-of select="PimID" /></h3></td>
                <td><p><xsl:value-of select="Description" /></p></td>
            </tr> 
        </xsl:if>
    </xsl:for-each>
</xsl:template>

Я не беспокоился ни о каком преобразовании идентичности, так как не хочу проходить через оставшиеся узлы или проходить через стандартные элементы схемы XML, поскольку я просто создаю строковые отчеты XHTML.

0 голосов
/ 30 июня 2018

Вы можете достичь этого с помощью следующих шаблонов:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />

    <!-- identity template - copies on no-match -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template> 

    <xsl:template match="/Export/TaskWords"> 
        <xsl:copy>
            <TABLE_A>
                <xsl:apply-templates select="TaskWord[starts-with(WordType,'A')]"/> 
            </TABLE_A>
            <xsl:apply-templates select="OtherContent"/>    <!-- Apply the rest -->
            <TABLE_B>
                <xsl:apply-templates select="TaskWord[starts-with(WordType,'B')]"/> 
            </TABLE_B>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Вывод:

<Export>
    <TaskWords>
        <TABLE_A><TaskWord>
                <ID>1</ID>
                <WordType>A01</WordType>
                <Body>blah</Body>
            </TaskWord>
            <TaskWord>
                <ID>2</ID>
                <WordType>A02</WordType>
                <Body>blah</Body>
            </TaskWord>
        </TABLE_A>
        <TABLE_B><TaskWord>
                <ID>3</ID>
                <WordType>B01</WordType>
                <Body>blah</Body>
            </TaskWord>
            <TaskWord>
                <ID>4</ID>
                <WordType>B02</WordType>
                <Body>blah</Body>
            </TaskWord>
        </TABLE_B>
    </TaskWords>
</Export>
0 голосов
/ 30 июня 2018
<xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="TaskWords">
        <xsl:copy>
            <table_A>
                <xsl:apply-templates select="TaskWord[WordType[starts-with(.,'A')]]"/>
                </table_A>
            <table_B>
                <xsl:apply-templates select="TaskWord[WordType[starts-with(.,'B')]]"/>
            </table_B>
        </xsl:copy>
    </xsl:template>
0 голосов
/ 30 июня 2018

Загляните в xsl: for-each-group. Установив соответствующие атрибуты, вы можете получить отдельные группы, где у всех членов группы есть условие, которое вы ищете. Затем вы можете выполнить обработку на уровне всей группы или для каждого члена группы в зависимости от ваших требований к продукции.

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