0

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

4

1 回答 1

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>

问题&#xA;在于第一个 Span,因为源 XML 中的第一个文本节点在其后包含换行符和空格。你想如何解决这个问题?normalize-space()将 a放入属性中很容易Text,但这也会去掉其他尾随空格。

于 2013-05-16T19:22:07.853 回答