我有以下XML
User entered text : Normal **Bold** *Italic*
u̲n̲d̲e̲r̲l̲i̲n̲e̲
***BoldItalic*** ***B̲o̲l̲d̲I̲t̲a̲l̲i̲c̲U̲n̲d̲e̲r̲l̲i̲n̲e̲***
生成的XHTML字符串存储在数据库表中。
<QuestionText xml:space="preserve">
<p>Normal
<b>Bold </b>
<i>Italic </i>
<u>Underline </u>
<b>Bold <i>BoldItalic </i>Bold </b>
<b><i>BoldItalic </i></b>
<b><i><u>BoldItalicUnderline</u></i></b>
</p>
<p/>
<p/>
<p/>
</QuestionText>
我需要转换为.Net X(A)ML如下
<Section>
<Paragraph>
<Span Text="Nornal " />
<Span FontWeight="Bold" Text="Bold " />
<Span FontStyle="Italic" Text="Italic " />
<Span Text="Underline " UnderlineDecoration="Line" />
<Span FontWeight="Bold" Text="Bold " />
<Span FontStyle="Italic" FontWeight="Bold" Text="BoldItalic " />
<Span FontWeight="Bold" Text="Bold " />
<Span FontStyle="Italic" FontWeight="Bold" Text="BoldItalic " />
<Span FontStyle="Italic" FontWeight="Bold" Text="BoldItalicUnderline" UnderlineDecoration="Line" />
</Paragraph>
<Paragraph/>
<Paragraph/>
<Paragraph/>
</Section>
我尝试使用此XSLT没有运气
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="QuestionText">
<Section>
<xsl:apply-templates/>
</Section>
</xsl:template>
<xsl:template match="b|i|u|p/text()" >
<span>
<xsl:attribute name="Text">
<xsl:value-of select="current()"/>
</xsl:attribute>
<xsl:attribute name="name">
<xsl:value-of select="name()"/>
</xsl:attribute>
<xsl:attribute name="parent">
<xsl:value-of select="name(..)"/>
</xsl:attribute>
<xsl:if test=".=i">
<xsl:attribute name="FontStyle">italic</xsl:attribute>
</xsl:if>
<xsl:if test=".=b">
<xsl:attribute name="FontWeight">bold</xsl:attribute>
</xsl:if>
<xsl:if test=".=u">
<xsl:attribute name="UnderlineDecoration">line</xsl:attribute>
</xsl:if>
</span>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
<Paragraph>
<xsl:apply-templates/>
</Paragraph>
</xsl:template>
</xsl:stylesheet>
非常感谢XSLT的任何帮助。
答案 0 :(得分:1)
这实际上产生了您提供的样本输出:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="QuestionText">
<Section>
<xsl:apply-templates />
</Section>
</xsl:template>
<xsl:template match="text()[normalize-space()]" >
<Span Text="{.}">
<xsl:apply-templates select="ancestor::*" mode="formatting" />
</Span>
</xsl:template>
<xsl:template match="i" mode="formatting">
<xsl:attribute name="FontStyle">italic</xsl:attribute>
</xsl:template>
<xsl:template match="b" mode="formatting">
<xsl:attribute name="FontWeight">bold</xsl:attribute>
</xsl:template>
<xsl:template match="u" mode="formatting">
<xsl:attribute name="UnderlineDecoration">line</xsl:attribute>
</xsl:template>
<xsl:template match="*" mode="formatting" />
<xsl:template match="p">
<Paragraph>
<xsl:apply-templates />
</Paragraph>
</xsl:template>
</xsl:stylesheet>
在样本输入上运行时,结果为:
<Section>
<Paragraph>
<Span Text="Normal 
 " />
<Span Text="Bold " FontWeight="bold" />
<Span Text="Italic " FontStyle="italic" />
<Span Text="Underline " UnderlineDecoration="line" />
<Span Text="Bold " FontWeight="bold" />
<Span Text="BoldItalic " FontWeight="bold" FontStyle="italic" />
<Span Text="Bold " FontWeight="bold" />
<Span Text="BoldItalic " FontWeight="bold" FontStyle="italic" />
<Span Text="BoldItalicUnderline" FontWeight="bold" FontStyle="italic" UnderlineDecoration="line" />
</Paragraph>
<Paragraph />
<Paragraph />
<Paragraph />
</Section>
问题是第一个Span中的

,因为源XML中的第一个文本节点包含换行符和后面的空格。你想怎么解决这个问题?在normalize-space()
属性中添加Text
会很容易,但这也会删除其他尾随空格。