我正在开发一个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技能因废弃而减少。
答案 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>