如何将内部文本和Xml复制到另一个标记中

时间:2012-11-16 16:32:57

标签: c# xml xslt

我正在开发一个C#应用程序,它将两个Xml文档分开,合并一些标记内容,并生成第三个Xml文档。我遇到的情况是我需要提取一个标签的值,包括内部标签,并将其传输到另一个标签。我开始做这样的事情:

var summaryElement = elementExternal.Element("summary");
var summaryValue = (string)summaryElement;
var summaryValueClean = ElementValueClean(summaryValue);

var result = new XElement("para", summaryValueClean)

ElementValueClean函数删除无关的空格。

如果摘要标记的值仅包含文本,则效果令人满意。当摘要标记包含以下子元素时,就会出现这种情况:

<summary>
   Notifies the context that a new link exists between the <paramref name="source" /> and <paramref name="target" /> objects
   and that the link is represented via the source.<paramref name="sourceProperty" /> which is a collection.
   The context adds this link to the set of newly created links to be sent to
   the data service on the next call to SaveChanges().
</summary>

我想生产这样的东西:

<para>
Notifies the context that a new link exists between the <paramref name="source" /> and <paramref name="target" /> objects
and that the link is represented via the source.<paramref name="sourceProperty" /> which is a collection.
The context adds this link to the set of newly created links to be sent to
the data service on the next call to SaveChanges().
</para>

我的源代码目录中可能会出现大约十几个可能的嵌入式代码,其内容我必须合并到输出代码中。所以我想要一个可以概括的C#解决方案。但是,如果它足够简单,我可以应用于Xml片段以生成Xml片段的Xslt转换对我也有用。我的Xslt技能因废弃而减少。

1 个答案:

答案 0 :(得分:1)

您可以更新ElementValueClean()函数以支持内联节点并接受Element而不是其字符串值:

foreach (XmlNode n in summaryElement.Nodes()) {
  if (node.NodeType == XmlNodeType.Text) {
      //do text cleanup
  }
  else n
}

重新封装元素的XSLT非常简单,但我认为C#解决方案仍然有用,因为你已经有了一个可用的C#文本清理解决方案。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

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

    <xsl:template match="node()|@*" priority="-1" mode="#default">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" mode="#current"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

或者你可以在XSLT中完成整个过程,包括文本清理。目前尚不清楚该函数的作用,但这是你在XSLT中启动它的方式:

<xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)"/>
</xsl:template>