5

我看到此异常消息来自 XslCompiledTransform.Transform(),但在处理异常后,XSL 转换似乎仍然成功。完整的异常消息是:

EndRootElement 状态中的标记文本将导致无效的 XML 文档。如果要编写 XML 片段,请确保将 ConformanceLevel 设置设置为 ConformanceLevel.Fragment 或 ConformanceLevel.Auto。

样式表如下所示:

<xsl:stylesheet version="1.0" xmlns:ext="ext:extensions" xmlns:f="http://schemas.foo.com/FOAMSchema">
  <xsl:template match="/Root/Documents/PO/DROPSHIP">
    <Transactions>
      <Transaction>
        <f:partnerTransmission>
          <transmission_id>
            <xsl:value-of select="ext:NewGUID()"/>
          </transmission_id>
          <partner_code>
            <xsl:value-of select="/Root/@PartnerCode"/>
          </partner_code>
          <control_nbr>
            <xsl:value-of select="@GS_CNTRL_NUM"/>
          </control_nbr>
          <creationTime>
            <xsl:value-of select="ext:ConvertToStandardDateTime(@DATE,@TIME,'ISO8601Basic')"/>
          </creationTime>
          <direction>I</direction>
          <messageCount>
            <xsl:value-of select="count(ORDERS/ORDER)"/>
          </messageCount>
          <syntax>XML</syntax>
          <format>BARBAZ</format>
          <deliveryMethod>FTP</deliveryMethod>
        </f:partnerTransmission>
      </Transaction>
    </Transactions>
  </xsl:template>
</xsl:stylesheet>

生成的 XML 如下所示:

<Transactions xmlns="http://schemas.foo.com/IntegrationProfile" xmlns:ext="ext:extensions">
  <Transaction>
    <f:partnerTransmission xmlns:f="http://schemas.foo.com/FOAMSchema">
      <transmission_id>a5e0ec76-6c24-426b-9eb5-aef9c45d913f</transmission_id>
      <partner_code>VN000033</partner_code>
      <control_nbr>650</control_nbr>
      <creationTime>9/27/2008 12:51:00 AM</creationTime>
      <direction>I</direction>
      <messageCount>2</messageCount>
      <syntax>XML</syntax>
      <format>BARBAZ</format>
      <deliveryMethod>FTP</deliveryMethod>
    </f:partnerTransmission>
  </Transaction>
</Transactions>

以上是我捕获并忽略异常时得到的结果。

我还没有找到设置 ConformanceLevel 的方法(该属性是只读的),但同时我也不认为这里应该有问题。

我的输出是否构成 XML 片段?我在样式表中遗漏了什么吗?

4

2 回答 2

8

例外是试图告诉您您已尝试在根元素的关闭元素之后输出文本。您的输出看起来正常的原因是异常阻止了生成无效的 XML。

原因很简单:您没有文档根目录的转换。因此,将执行默认转换。这些会将所有元素的文本内容作为文本节点输出。

添加

<xsl:template match="/">
    <xsl:apply-templates select="/Root/Documents/PO/DROPSHIP"/>
</xsl:template>
于 2010-03-16T03:30:51.327 回答
0

您的输出确实构成了格式良好的 XML 片段。换句话说,它看起来不错,您的 XSLT 也不错。

似乎错误消息试图告诉您以下内容:

应用此 XSLT 会生成一个根据 DTD 或 Schema 或我用来验证输出的任何内容无效的文档,并且我conformanceLevel告诉我抱怨输出无效。如果您不关心有效性,请将 my 设置conformanceLevel为不那么肛门的东西。

请注意“格式良好”(符合标准的非验证 xml 解析器可以读取它)和“有效”(结构不遵循模式中指定的语法)之间的重要区别。

另请注意,在 XSLT 中不可能生成格式不正确的 XML 输出。

于 2008-10-16T18:24:53.257 回答