Xsl变换在两个<;xsl:value-of-select';s

本文关键字:lt xsl value-of-select 两个 变换 Xsl | 更新日期: 2023-09-27 18:01:04

我的xsl文件中有以下行:

   network <xsl:value-of select="/config/areas/inside/network"/>&#32;<xsl:value-of select="/config/areas/inside/subnetmask"/>

我在C#中的转换代码:

        XPathDocument xPathDoc = new XPathDocument(xmlPath);
        //XslTransform xslTrans = new XslTransform(); -> Deprecated!
        XslCompiledTransform xslTrans = new XslCompiledTransform();
        XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8);
        xslTrans.Load(xslPath);
        xslTrans.Transform(xPathDoc, null, writer);
        writer.Close();

对于不推荐使用的版本,一切都很好(在我将ASCII代码放在两个元素之间的一个空格之后(,但XslCompiledTransform类中有一些其他规范化算法,我不知道如何避免这种行为。

有什么建议吗?

Xsl变换在两个<;xsl:value-of-select';s

好的,这里的问题是,当您将&#32;放入XML文档中时,从技术上讲,这与输入普通空间没有什么不同,因此XML解析器将其视为空白。

我建议把那条线改成

<xsl:value-of select="concat('network ',/config/areas/inside/network,' ',/config/areas/inside/subnetmask)" />

通过将空间封闭在像这样的concat函数中,它就不会作为自己的节点出现在XML文档中,也不会被误认为是不相关的空白。

与您的问题无关,但我也建议将XmlTextWriter封装在使用块中:

using (XmlTextWriter writer = new XmlTextWriter("config.cfg", Encoding.UTF8))
{
    xslTrans.Load(xslPath);
    xslTrans.Transform(xPathDoc, null, writer);
}

它自动正确处理写入程序的处理。