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字符串报告。
我有一个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字符串报告。