3

我有一个相当简单的 xsl 样式表,用于将定义我们的 html 的 xml 文档转换为 html 格式(请不要问为什么,这只是我们必须这样做的方式......)

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="HtmlElement">
  <xsl:element name="{ElementType}">
    <xsl:apply-templates select="Attributes"/>
    <xsl:value-of select="Text"/>
    <xsl:apply-templates select="HtmlElement"/>
  </xsl:element>
</xsl:template>

<xsl:template match="Attributes">
  <xsl:apply-templates select="Attribute"/>
</xsl:template>

<xsl:template match="Attribute">
  <xsl:attribute name="{Name}">
    <xsl:value-of select="Value"/>
  </xsl:attribute>
</xsl:template>

当我遇到需要转换的一小段 HTML 时,问题就出现了:

<p>
      Send instant ecards this season <br/> and all year with our ecards!
</p>

中间<br/>的打破了转换的逻辑,只给了我段落块的前半部分:Send instant ecards this season <br></br>. 尝试转换的 XML 如下所示:

<HtmlElement>
    <ElementType>p</ElementType>
    <Text>Send instant ecards this season </Text>
    <HtmlElement>
      <ElementType>br</ElementType>
    </HtmlElement>
    <Text> and all year with our ecards!</Text>
</HtmlElement>

建议?

4

2 回答 2

1

您可以简单地为 Text 元素添加新规则,然后匹配 HTMLElements 和 Texts:

<xsl:template match="HtmlElement">
  <xsl:element name="{ElementName}">
    <xsl:apply-templates select="Attributes"/>
    <xsl:apply-templates select="HtmlElement|Text"/>
  </xsl:element>
</xsl:template>

<xsl:template match="Text">
    <xsl:value-of select="." />
</xsl:template>
于 2013-01-04T22:44:51.647 回答
0

您可以使样式表更通用一点,以便通过 调整模板来处理HtmlElement其他Attributes元素的。AttributesHtmlElementxsl:apply-templates

内置模板将匹配Text元素并将其复制text()到输出。

此外,您当前已声明的根节点模板(即match="/")可以被删除。它只是重新定义了内置模板规则已经处理的内容,并且不做任何改变行为的事情,只是弄乱了你的样式表。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output indent="yes"/>

<!--    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>-->

    <xsl:template match="HtmlElement">
        <xsl:element name="{ElementType}">
            <xsl:apply-templates select="Attributes"/>
            <!--apply templates to all elements except for ElementType and Attributes-->
            <xsl:apply-templates select="*[not(self::Attributes|self::ElementType)]"/>
        </xsl:element>
    </xsl:template>

    <xsl:template match="Attributes">
        <xsl:apply-templates select="Attribute"/>
    </xsl:template>

    <xsl:template match="Attribute">
        <xsl:attribute name="{Name}">
            <xsl:value-of select="Value"/>
        </xsl:attribute>
    </xsl:template>

</xsl:stylesheet>
于 2013-01-05T14:33:40.053 回答