如何读取下面的元素/标签 - 使用xsl + xpath,我试图格式化xml输出以从style属性中读取对齐标签,但我无法弄清楚...(最后的手段c# )
编辑:为了使我的回答清楚,我可以阅读许多html文档,我很可能会有一个允许解析的允许标记列表,所以不是所有内容都需要解析,因为我是使用xslt将文档转换为xml我到目前为止编写我的解决方案时只记住xsl + xpath,但是如果我要使用c#和linq(迭代文档) - 显然会设置所有样式然后我将使用其他附加内容转换我的文档。
<h1 style="text-align: right;">Another chapter</h1>
我的Xsl:
<xsl:template match="h1">
<fo:block color="black" font-family="Arial, Verdana, sans-serif">
<xsl:call-template name="set-alignment"/>
</fo:block>
</xsl:template>
<xsl:template name="set-alignment">
<xsl:choose>
<xsl:when test="@align='left'">
<xsl:attribute name="text-align">start</xsl:attribute>
</xsl:when>
<xsl:when test="@align='center'">
<xsl:attribute name="text-align">center</xsl:attribute>
</xsl:when>
<xsl:when test="@align='right'">
<xsl:attribute name="text-align">end</xsl:attribute>
</xsl:when>
</xsl:choose>
</xsl:template>
注意,下面只定义了一种样式,但可能有很多......(下划线等)
期望的输出:
<h1 text-align="start" text-decoration="underline" >Another chapter</h1>
答案 0 :(得分:0)
使用众所周知的标记化模式,这个样式表:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="h1">
<xsl:copy>
<xsl:apply-templates select="@*[name()!='style']"/>
<xsl:call-template name="tokenize-style"/>
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template name="tokenize-style">
<xsl:param name="pString" select="string(@style)"/>
<xsl:choose>
<xsl:when test="not($pString)"/>
<xsl:when test="contains($pString,';')">
<xsl:call-template name="tokenize-style">
<xsl:with-param name="pString"
select="substring-before($pString,';')"/>
</xsl:call-template>
<xsl:call-template name="tokenize-style">
<xsl:with-param name="pString"
select="substring-after($pString,';')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:attribute name="{normalize-space(
substring-before($pString,':')
)}">
<xsl:value-of select="normalize-space(
substring-after($pString,':')
)"/>
</xsl:attribute>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
输出:
<h1 text-align="right">Another chapter</h1>