使用XSLT将XHTML转换为XAML

时间:2013-05-16 17:11:27

标签: xml xslt xml-parsing

我有以下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的任何帮助。

1 个答案:

答案 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 &#xA;    " />
    <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中的&#xA;,因为源XML中的第一个文本节点包含换行符和后面的空格。你想怎么解决这个问题?在normalize-space()属性中添加Text会很容易,但这也会删除其他尾随空格。