整合两个 xslt 模板 rowmerge 和标签删除的问题
Issue in integarting two xslt templates rowmerge and tag removal
We have two diffrent scenario we got answers in the forum
(我们需要检索 Thead 中 para 内的 ref 标签我们需要删除 Tbody 中 para 内的 ref 标签。对于最后一个单元格,我们不应该执行此 ref 删除。即)应该表现得像 thead)
writing xslt for the below scenario
(规则:对于合并行:将主合并单元格的内容复制到合并行中的其他单元格。)
但是 integrating/testing 我们遇到了问题。整合后,我们没有得到预期的 output.ie) 标签移除在第一行完成,但在合并的行中它是noit heppening。
有人可以在这方面帮助我们吗?
示例输入:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER" >
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" "><refint>S.No1 </refint> </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" "> <refint>Role1</refint></Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" "></Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" "><refint>Role3</refint></Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL>
</ROW>
</TBODY>
</TABLE>
XSLT 尝试过:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="table">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TBODY/ROW/CELL[position()!=last()]/Para/refint">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select=" ../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
</xsl:transform>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER" >
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role1</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role3</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL>
</ROW>
</TBODY>
</TABLE>
我们得到了:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER">
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F"><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F"><Para appdisplaytext=" ">Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T"><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F"><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F"><Para appdisplaytext=" ">Role1</Para></CELL>
<CELL colmerged="F"><Para appdisplaytext=" ">Comment1</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T"><Para appdisplaytext=" "><refint>S.No1 </refint> </Para> </CELL> (We are getting ref int here.)
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name2</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role2</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment2</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F"> <Para appdisplaytext=" ">S.No 3</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name3</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role3</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment3</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F"> <Para appdisplaytext=" ">S.No 4</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name4</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role4</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment4</Para> </CELL>
</ROW>
</TBODY>
</TABLE>
问题出现在这个模板中
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
当您匹配 "empty" Para
元素时,其中 rowmerged
是 "T",然后您从前面的 [=16] 复制相应的 Para
=].但是因为您正在使用 xsl:copy-of
这将复制它而无需任何进一步的转换。 xsl:copy-of
从输入树复制,并且不考虑您之前可能对该节点所做的任何转换(在输出中,而不是输入中)。
尝试使用 xsl:apply-templates
代替:
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:apply-templates select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
通过使用 xsl:apply-templates
,它将在您此时选择的节点上应用任何变换。
编辑: 如果您只想复制 Para
节点的 children,请尝试复制 Para
节点的模板正在匹配,但从前一个兄弟复制 children。
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="$matchingCells[normalize-space()][last()]/node()"/>
</xsl:copy>
</xsl:template>
We have two diffrent scenario we got answers in the forum
(我们需要检索 Thead 中 para 内的 ref 标签我们需要删除 Tbody 中 para 内的 ref 标签。对于最后一个单元格,我们不应该执行此 ref 删除。即)应该表现得像 thead)
writing xslt for the below scenario
(规则:对于合并行:将主合并单元格的内容复制到合并行中的其他单元格。) 但是 integrating/testing 我们遇到了问题。整合后,我们没有得到预期的 output.ie) 标签移除在第一行完成,但在合并的行中它是noit heppening。 有人可以在这方面帮助我们吗?
示例输入:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER" >
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" "><refint>S.No1 </refint> </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" "> <refint>Role1</refint></Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" "></Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" "><refint>Role3</refint></Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL>
</ROW>
</TBODY>
</TABLE>
XSLT 尝试过:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="table">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="TBODY/ROW/CELL[position()!=last()]/Para/refint">
<xsl:value-of select="."/>
</xsl:template>
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select=" ../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
</xsl:transform>
预期输出:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER" >
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role1</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role3</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
<CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
<CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL>
</ROW>
</TBODY>
</TABLE>
我们得到了:
<?xml version="1.0" encoding="UTF-8"?>
<TABLE align="CENTER">
<THEAD editable="T">
<ROW editable="F">
<CELL rowmerged="F"><Para appdisplaytext=" ">S.No </Para></CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name</Para></CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role</Para></CELL>
<CELL colmerged="F"><Para appdisplaytext=" ">Comment</Para></CELL>
</ROW>
</THEAD>
<TBODY editable="T">
<ROW editable="F">
<CELL rowmerged="T"><Para appdisplaytext=" ">S.No1 </Para></CELL>
<CELL rowmerged="F"><Para appdisplaytext=" ">Name1</Para></CELL>
<CELL rowmerged="F"><Para appdisplaytext=" ">Role1</Para></CELL>
<CELL colmerged="F"><Para appdisplaytext=" ">Comment1</Para></CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="T"><Para appdisplaytext=" "><refint>S.No1 </refint> </Para> </CELL> (We are getting ref int here.)
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name2</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role2</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment2</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F"> <Para appdisplaytext=" ">S.No 3</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name3</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role3</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment3</Para> </CELL>
</ROW>
<ROW editable="F">
<CELL rowmerged="F"> <Para appdisplaytext=" ">S.No 4</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Name4</Para> </CELL>
<CELL rowmerged="F"> <Para appdisplaytext=" ">Role4</Para> </CELL>
<CELL colmerged="F"> <Para appdisplaytext=" ">Comment4</Para> </CELL>
</ROW>
</TBODY>
</TABLE>
问题出现在这个模板中
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
当您匹配 "empty" Para
元素时,其中 rowmerged
是 "T",然后您从前面的 [=16] 复制相应的 Para
=].但是因为您正在使用 xsl:copy-of
这将复制它而无需任何进一步的转换。 xsl:copy-of
从输入树复制,并且不考虑您之前可能对该节点所做的任何转换(在输出中,而不是输入中)。
尝试使用 xsl:apply-templates
代替:
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:apply-templates select="$matchingCells[normalize-space()][last()]"/>
</xsl:template>
通过使用 xsl:apply-templates
,它将在您此时选择的节点上应用任何变换。
编辑: 如果您只想复制 Para
节点的 children,请尝试复制 Para
节点的模板正在匹配,但从前一个兄弟复制 children。
<xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
<xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
<xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="$matchingCells[normalize-space()][last()]/node()"/>
</xsl:copy>
</xsl:template>