XSLT 应用子元素以 'A' 开头的模板

XSLT Apply Templates where child element starts with 'A'

我有一个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 代码应用了一个模板,该模板构建了 TaskWords 的 XHTML table,按 WordType 分组。

我想将模板应用于 TaskWords 的子集,例如 WordType 以 'A' 开头;这样我就可以将所有 'A' WordType 放入报告的一个 table 中,然后从其他地方添加更多内容,然后跟进所有 [=25] 中的 table =] 单词类型。

我一直在尝试按照以下方式拨打电话,但无济于事:

<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')]]"/> 

我在尝试使用 apply-templates 命令的 select 语句过滤 TaskWords 的过程中是否走在正确的道路上?任何建议、指示或解决方案将不胜感激。

查看 xsl:for-每个组。通过设置适当的属性,您可以获得不同的组,其中组的所有成员都具有您正在查找的条件。然后你可以在整个组级别进行处理,或者根据你的输出要求对组中的每个成员进行处理。

您可以使用以下模板实现此目的:

<?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>
<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>

对于其他人,我采用的解决方案如下...

<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字符串报告。