.net 以粗体显示XSLT输出中更改的元素
我正在开发一个软件,为飞机操作员开发飞行计划。飞机有一个可以调整各种设置的传感器,这些设置通过我们称之为飞行计划“分段”的方式进行分割。(段是计划中的某一特定时间,传感器设置仅在段之间移动时更改。) 飞行计划输出为HTML文件,该文件通过C#NET中的XslCompiledTransform对序列化XML对象进行XSL转换生成。其结构非常一致,因为需要调整的设置数量有限。对于每个段,输出一对表,由.net 以粗体显示XSLT输出中更改的元素,.net,xslt,.net,Xslt,我正在开发一个软件,为飞机操作员开发飞行计划。飞机有一个可以调整各种设置的传感器,这些设置通过我们称之为飞行计划“分段”的方式进行分割。(段是计划中的某一特定时间,传感器设置仅在段之间移动时更改。) 飞行计划输出为HTML文件,该文件通过C#NET中的XslCompiledTransform对序列化XML对象进行XSL转换生成。其结构非常一致,因为需要调整的设置数量有限。对于每个段,输出一对表,由标记分隔 我想能够做的是获取该输出,每次设置从一个段更改到另一个段时,通过将其包装在标记中,在最终输
标记分隔
我想能够做的是获取该输出,每次设置从一个段更改到另一个段时,通过将其包装在
标记中,在最终输出中加粗该设置的文本。(意译)示例:(为澄清而编辑)
设置1a
设置2b
设置3c
设置1a
设置2d
设置3c
考虑到XSL转换的输出,我想用or标记将c包装成粗体,结果如下:
<table>
<tr>
<td>Setting 1</td><td>a</td>
<td>Setting 2</td><td>b</td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td><td>c</td>
</tr>
<table>
<hr />
<table>
<tr>
<td>Setting 1</td><td>a</td>
<td>Setting 2</td><td><b>d</b></td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td><td>c</td>
</tr>
<table>
设置1a
设置2b
设置3c
设置1a
设置2d
设置3c
我不确定是否要在.net中编写助手对象、使用实用程序、通过单独的XSL转换运行输出,或者做些什么考虑到我手头的工具,最好的方法是什么?此XSLT 1.0转换:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"table[preceding-sibling::table[2]]
/tr
/td[position() mod 2 = 0]
">
<xsl:variable name="vPos" select="position()"/>
<xsl:variable name="vPrevTableTD" select=
"../../preceding-sibling::table[2]
/tr/td[position() = $vPos]"/>
<td>
<xsl:choose>
<xsl:when test="not(. = $vPrevTableTD)">
<b><xsl:value-of select="."/></b>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:template>
</xsl:stylesheet>
<html>
<table>
<tr>
<td>Setting 1</td>
<td>a</td>
<td>Setting 2</td>
<td>b</td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td>
<td>c</td>
</tr>
</table>
<hr>
<table>
<tr>
<td>Setting 1</td>
<td>a</td>
<td>Setting 2</td>
<td><b>d</b></td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td>
<td>c</td>
</tr>
</table>
</html>
应用于以下XML文档时(制作格式良好的XML文档后提供的文档):
设置1
A.
设置2
B
设置3
C
设置1
A.
设置2
D
设置3
C
生成所需的正确结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match=
"table[preceding-sibling::table[2]]
/tr
/td[position() mod 2 = 0]
">
<xsl:variable name="vPos" select="position()"/>
<xsl:variable name="vPrevTableTD" select=
"../../preceding-sibling::table[2]
/tr/td[position() = $vPos]"/>
<td>
<xsl:choose>
<xsl:when test="not(. = $vPrevTableTD)">
<b><xsl:value-of select="."/></b>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="."/>
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:template>
</xsl:stylesheet>
<html>
<table>
<tr>
<td>Setting 1</td>
<td>a</td>
<td>Setting 2</td>
<td>b</td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td>
<td>c</td>
</tr>
</table>
<hr>
<table>
<tr>
<td>Setting 1</td>
<td>a</td>
<td>Setting 2</td>
<td><b>d</b></td>
</tr>
</table>
<table>
<tr>
<td>Setting 3</td>
<td>c</td>
</tr>
</table>
</html>
设置1
A.
设置2
B
设置3
C
设置1
A.
设置2
D
设置3
C
您是否要求XSLT转换将第一次转换的输出转换为新的所需格式?如果是这样的话,您能否提供一个最小但格式良好的XML文档,它是第一次转换的输出,应该是所需转换的输入?为了清晰起见,我编辑了我的示例(以显示与我提到的hr匹配的表对)。我不想上传真正的HTML,因为这是一个专有的政府项目;我相信你能理解。:)为什么不能只提供一次格式良好的XML呢?您的需求不太清楚。。可能您缺少关键规则..我的示例不太清楚,因此我在使用此样式表时没有太大成功。很抱歉。为了清晰起见,我更新了示例。@JimDagg:我已经编辑了答案。它现在处理您最新的XML文档格式并生成所需的结果。