c# – cdata-section-elements不工作
发布时间:2020-12-15 22:41:34 所属栏目:百科 来源:网络整理
导读:我试图通过设置全局参数在通过XSLT(使用Saxon-HE v9.7.0.14)生成的xml文件中设置密码. 密码可以包含任何字符,因此需要将其放在CDATA部分中. 我试图通过设置我的xslt的xsl:output元素的cdata-section-elements属性来包含密码元素的名称来实现这一点: xsl:ou
我试图通过设置全局参数在通过XSLT(使用Saxon-HE v9.7.0.14)生成的xml文件中设置密码.
密码可以包含任何字符,因此需要将其放在CDATA部分中. 我试图通过设置我的xslt的xsl:output元素的cdata-section-elements属性来包含密码元素的名称来实现这一点: <xsl:output method="xml" indent="yes" cdata-section-elements="password"/> 这不起作用.我在下面列出了示例代码,输入,xslt,当前输出和所需输出. 在CDATA部分中需要更改以获取密码? 程序: using System; using System.IO; using Saxon.Api; namespace XsltTest { class Program { static void Main(string[] args) { var xslt = new FileInfo(@"transform.xslt"); var input = new FileInfo(@"input.xml"); var output = new FileInfo(@"output.xml"); var processor = new Processor(); var compiler = processor.NewXsltCompiler(); var executable = compiler.Compile(new Uri(xslt.FullName)); var transformer = executable.Load(); var destination = new DomDestination(); using (var inputStream = input.OpenRead()) { transformer.SetInputStream(inputStream,new Uri(Path.GetTempPath())); transformer.SetParameter( new QName("password"),new XdmAtomicValue("secret")); transformer.Run(destination); } destination.XmlDocument.Save(output.FullName); } } } Transform.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" exclude-result-prefixes="msxsl"> <xsl:output method="xml" indent="yes" cdata-section-elements="password"/> <xsl:param name="password" /> <xsl:template match="@* | node()"> <bar> <username> <xsl:value-of select="//username"/> </username> <password> <xsl:value-of select="$password"/> </password> </bar> </xsl:template> </xsl:stylesheet> Input.xml文件: <?xml version="1.0" encoding="utf-8" ?> <foo> <username>john</username> </foo> 与Output.xml: <bar> <username>john</username> <password>secret</password> </bar> 密码不会放在CDATA部分内. 期望的结果: <bar> <username>john</username> <password><![CDATA[secret]]></password> </bar> 解决方法
xsl:output上的选项会影响序列化程序的操作,如果输出未序列化,则它们不起作用.您正在写一个DomDestination而不是一个Serializer(然后使用DOM方法序列化DOM,这些方法对XSLT xsl:output声明一无所知).
在任何情况下,你的前提都是错误的:“密码可以包含任何字符,因此需要将其放入CDATA部分.”如果没有cdata-section-elements,将使用实体引用(例如& lt;)序列化特殊字符.和& amp ;,这应该工作得很好. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- c# – IEnumerable,Arity和Generic Type Definitions
- Code::Blocks 使用 SQLite3
- 这个XML Schema有什么根本错误吗?
- iphone – 将UILabel声明组合在一行上
- React中state和props
- react-native-android – React Native saveToCameraRoll在
- WCF实现的计算器功能实例
- swift错误:expected a digit after integer literal prefi
- ruby – Rackup:无法加载这样的文件’sinatra’
- postgresql – 格式()中整数变量的格式说明符,用于EXECUTE?