【问题标题】:XSL Transformation of XML into smaller XMLXSL 将 XML 转换为更小的 XML
【发布时间】:2020-08-20 11:48:53
【问题描述】:

我有一些 XML 文件要转换成更小的标准化 XML 文件。为此,我使用 VBA 和 XSLT 作为模板。

我的问题是我在转换时收到错误,并且在使用 http://xsltransform.net/ 时我无法在 XSLT 模板中发现错误。

有人可以帮我调整 XSLT 以便能够使用节点“FileVersion”提取/创建 XML

下面是 XML 文件的示例:

    <?xml version="1.0" encoding="UTF-8"?>
<AuditFile xmlns="urn:UP:Standard" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:UP:Standard C:\Standard.XSD">
<Header>
<FileVersion>1_01</FileVersion>
<CompanyID>507</CompanyID>
<TaxBasis>W239</TaxBasis>
    
</Header>
</AuditFile>

使用的 XSL 模板:

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


  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/Header">
    <root>
      <xsl:apply-templates select="FileVersion"/>
    </root>
  </xsl:template>

  <xsl:template match="Header">
    <FileVersion>
      <xsl:value-of select="FileVersion" />
    </FileVersion>
  </xsl:template>

</xsl:stylesheet>

【问题讨论】:

  • 如果您收到错误,则显示确切的错误消息。运行您的代码时我没有收到任何错误 - 但结果不是您所期望的,因为 (1) Header 不是根元素并且 (2) 源 XML 具有默认命名空间并且 (3) 您没有模板匹配FileVersion.

标签: xml xslt


【解决方案1】:
  • 您的文档内容绑定到命名空间urn:UP:Standard。为了在 XSLT 中的 XPath 中处理它们,您需要声明该名称空间并在 XPath 中使用前缀。在这个解决方案中,我选择了命名空间前缀UP,但你可以使用任何你想要的东西,只要你在样式表的 XPath 中引用它的方式一致。
  • 根元素是/UP:AuditFile,因此您定义的匹配/Header 的模板不会匹配任何内容。如果您希望在文档处理开始时匹配模板以创建&lt;root> 元素,然后生成&lt;FileVersion&gt;,则可以匹配//UP:AuditFileUP:AuditFile。李>
  • 从匹配UP:AuditFile 的模板中,您希望将模板应用到它的UP:Header 子元素,然后它将匹配匹配UP:Header 的模板,您可以在其中构造自己的&lt;FileVersion&gt; 元素(没有命名空间),然后选择 xsl:value-of 它的子元素 UP:FileVersion
  • 由于输出中未使用urn:UP:Standard 命名空间,您可以通过将exclude-result-prefixes="UP" 添加到xsl:stylesheet 元素来将其从输出中排除。

已应用调整:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0" 
    xmlns:UP="urn:UP:Standard" exclude-result-prefixes="UP">

    <xsl:output method="xml" indent="yes" />
    
    <xsl:template match="UP:AuditFile">
        <root>
            <xsl:apply-templates select="UP:Header"/>
        </root>
    </xsl:template>
    
    <xsl:template match="UP:Header">
        <FileVersion>
            <xsl:value-of select="UP:FileVersion" />
        </FileVersion>
    </xsl:template>
    
</xsl:stylesheet>

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 2014-07-30
    • 2016-03-13
    • 2014-08-11
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    相关资源
    最近更新 更多