【问题标题】:Need XSLT to use param which holds dynamic value, create an XML and validate against XSD需要 XSLT 使用具有动态值的参数,创建 XML 并针对 XSD 进行验证
【发布时间】:2019-03-03 20:24:21
【问题描述】:

我有一个包含以下动态 xml 的参数“abc”:

<?xml version="1.0" encoding="UTF-8" ?>
<hello type="PROCESS"><process urn="hello"><object></object><object></object></process></hello>

我需要一个 XSLT 来使用属性“abc”并创建所需的 xml。

我尝试过的 XSLT。

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://tempuri.org/">
<xsl:param name="abc"/>
<xsl:template match="/">
    <xsl:value-of select="normalize-space($abc)"  disable-output-escaping="yes" />
</xsl:template>

应用此 XSLT 时收到错误:异常类型 System.Xml.XmlException:意外的 XML 声明。 XML 声明必须是文档中的第一个节点,并且之前不允许出现空白字符。

所需的xml

<?xml version="1.0" encoding="UTF-8" ?>
<hello type="PROCESS"><process urn="hello"><object></object><object></object></process></hello>

【问题讨论】:

  • 肯定有错误,因为你的Desired.xml和输入的一模一样。还请发布您已经尝试过的内容并描述无效的内容。
  • 但我的输入在属性“abc”中。我需要使用 xslt 将其转换为所需的 xml。
  • 所以你真的想输出与给定完全相同的 XML?
  • 您在 XML 声明 处理指令 中缺少尾随 ?。它应该如下所示:&lt;?xml version="1.0" encoding="UTF-8" ?&gt;处理说明&lt;?开头,以?&gt;结尾。
  • 请显示最少但完整的 C# 代码以重现错误。

标签: xml xslt xslt-1.0


【解决方案1】:

您可以像这样复制整个 XML 文档树:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
       <xsl:copy-of select="." />
    </xsl:template>
</xsl:stylesheet>

xsl:copy-of documentation

【讨论】:

  • xml 在属性 $abc 中
  • 在您的描述中,您说 C# 属性“abc”,这意味着像 myObject.abc 这样的类的属性。但是在你的例子中,你有 xsl 参数“abc”,我很困惑。请定义什么是适合您的财产。如果你在 xsl 参数中有它,那么你可以只做&lt;xsl:value-of select = "$abc" /&gt;,但我不明白这个练习的意义何在。您的解决方案有什么问题?
  • 抱歉措辞有误。 "abc" 是一个可以获取动态 xml 的参数。我需要将参数转换为 xml,针对 xsd 进行验证以确保我收到了正确的 xml。
  • 您的解决方案帮助我找到了正确的解决方案。感谢您的帮助。
【解决方案2】:

由于某种原因,复制包含动态 xml 的参数不起作用。所以我创建了一个根,剥离了 xml 声明并在根中加载了动态 xml。

我针对根元素创建了 XSD,并且它起作用了。

<?xml version='1.0' ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
<xsl:param name="abc"/>
<xsl:template match="/">
<myRoot>
    <xsl:value-of select="substring-after($abc,'>')" disable-output-escaping="yes"/>
</myRoot>
</xsl:template>

感谢所有参与并帮助我解决问题的人。

【讨论】:

    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    相关资源
    最近更新 更多