0

我正在尝试使用 XSL 样式表使用 Transform.xsl 文件将 Source.xml 文件转换为 Desired.xml 格式。除了节点中的命名空间属性外,我设法正确地对其进行了转换。有谁知道我需要在 xsl 转换文件中添加什么来添加该属性?

所需的.xml

<?xml version="1.0"?>
<XML_FAX_SUBMIT java="0" xmlns="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml" stylesheet="C:\rf\XML_FAX_SUBMIT.XSL">
  <SENDER>
    <FROM_NAME>John Public</FROM_NAME>
    <RF_USER>JOHN</RF_USER>
  </SENDER>
  <DESTINATIONS>
    <FAX unique_id="1">
      <TO_FAXNUM>1234</TO_FAXNUM>
      <TO_NAME>Public</TO_NAME>
      <TO_COMPANY>ACME</TO_COMPANY>
      <NOTIFY_HOST SuccessTemplate="1.inc" FailureTemplate="2.inc" Name="NotifyImportServer"/>
    </FAX>
  </DESTINATIONS>
  <ATTACHMENT>
    <FILE path="c:\test\test.tif"/>
  </ATTACHMENT>
</XML_FAX_SUBMIT>

源代码.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DrivveImage>
  <Documents>
    <Document Profile="Test" Profile-ID="0xA84E80AD7068B048B1B99E12E258F1B3" File="test.tif" Destination="C:\test" ImageFilePath="C:\test\test.tif" Pages="1">
      <Fields>        
        <Field Name="FROM_NAME">John Public</Field>
        <Field Name="RF_USER">JOHN</Field>
        <Field Name="TO_FAXNUM">1234</Field>
        <Field Name="TO_NAME">Public</Field>
        <Field Name="TO_COMPANY">ACME</Field>
        <Field Name="UNIQUE_ID">1</Field>
       </Fields>
    </Document>
  </Documents>
</DrivveImage>

转换.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" media-type="text/xml" indent="yes"/>
    <xsl:template match="/DrivveImage/Documents/Document">
        <xsl:element name="XML_FAX_SUBMIT">
            <xsl:attribute name="stylesheet">
                <xsl:value-of select="string('C:\RF\XML_FAX_SUBMIT.XSL')"/>
            </xsl:attribute>
            <xsl:attribute name="java">
                <xsl:value-of select="0"/>
            </xsl:attribute> 
            <SENDER>      
                <FROM_NAME>
                    <xsl:value-of select="Fields/Field[@Name='FROM_NAME']"/>
                </FROM_NAME>
                <RF_USER>
                    <xsl:value-of select="Fields/Field[@Name='RF_USER']"/>
                </RF_USER>
            </SENDER>
            <DESTINATIONS>        
                <FAX>
                    <xsl:attribute name="unique_id">
                        <xsl:value-of select="Fields/Field[@Name='UNIQUE_ID']"/>
                    </xsl:attribute>         
                    <TO_FAXNUM>
                        <xsl:value-of select="Fields/Field[@Name='TO_FAXNUM']"/>
                    </TO_FAXNUM>
                    <TO_NAME>
                        <xsl:value-of select="Fields/Field[@Name='TO_NAME']"/>
                    </TO_NAME>
                    <TO_COMPANY>
                        <xsl:value-of select="Fields/Field[@Name='TO_COMPANY']"/>
                    </TO_COMPANY>
                    <NOTIFY_HOST SuccessTemplate="1.inc" FailureTemplate="1.inc" Name="NotifyImportServer" />
                </FAX>
            </DESTINATIONS>
            <xsl:element name="ATTACHMENT"> 
                <FILE>
                    <xsl:attribute name="path"><xsl:value-of select="@Destination"/>\<xsl:value-of select="@File"/></xsl:attribute>
                </FILE>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

提前致谢。

4

1 回答 1

0

严格来说,它不是命名空间属性,而是命名空间声明。您声明所需 XML 中的所有元素都是此命名空间的一部分。但是,在您的源 XML 中,没有名称空间声明,因此没有任何源元素位于名称空间中。此外,在 XSLT 中没有对命名空间的引用,因此您的当前输出没有命名空间。

您需要做的是确保您在 XSLT 中输出的元素属于您需要的名称空间。您可以使用xsl:element命令上的命名空间属性来创建根XML_FAX_SUBMIT元素:

<xsl:element name="XML_FAX_SUBMIT" namespace="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml">

但是,当以这种方式使用时,它只会设置指定元素的命名空间。您还需要在SENDERDESTINATIONS元素上进行设置,例如

<SENDER xmlns="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml">

<DESTINATIONS xmlns="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml">

这样做意味着所有子元素也属于同一个命名空间。

事实上,如果您以这种方式创建XML_FAX_SUBMIT元素会更容易

<XML_FAX_SUBMIT xmlns="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml">

然后,您只需在一处添加命名空间声明。

尝试以下 XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="xml" encoding="UTF-8" media-type="text/xml" indent="yes"/>
  <xsl:template match="/DrivveImage/Documents/Document">
    <XML_FAX_SUBMIT xmlns="x-schema:C:\rf\XML_FAX_SUBMIT_schema.xml" stylesheet="{string('C:\RF\XML_FAX_SUBMIT.XSL')}" java="0">
      <xsl:attribute name="stylesheet">
        <xsl:value-of select="string('C:\RF\XML_FAX_SUBMIT.XSL')"/>
      </xsl:attribute>
      <xsl:attribute name="java">
        <xsl:value-of select="0"/>
      </xsl:attribute>
      <SENDER>
        <FROM_NAME>
          <xsl:value-of select="Fields/Field[@Name='FROM_NAME']"/>
        </FROM_NAME>
        <RF_USER>
          <xsl:value-of select="Fields/Field[@Name='RF_USER']"/>
        </RF_USER>
      </SENDER>
      <DESTINATIONS>
        <FAX unique_id="{Fields/Field[@Name='UNIQUE_ID']}">
          <TO_FAXNUM>
            <xsl:value-of select="Fields/Field[@Name='TO_FAXNUM']"/>
          </TO_FAXNUM>
          <TO_NAME>
            <xsl:value-of select="Fields/Field[@Name='TO_NAME']"/>
          </TO_NAME>
          <TO_COMPANY>
            <xsl:value-of select="Fields/Field[@Name='TO_COMPANY']"/>
          </TO_COMPANY>
          <NOTIFY_HOST SuccessTemplate="1.inc" FailureTemplate="1.inc" Name="NotifyImportServer" />
        </FAX>
      </DESTINATIONS>
      <ATTACHMENT>
        <FILE path="{@Destination}\{@File}">
        </FILE>
      </ATTACHMENT>
    </XML_FAX_SUBMIT>
  </xsl:template>
</xsl:stylesheet>

还要注意使用“属性值模板”来设置属性,而不是xsl:attribute。在属性中看到花括号 { } 的地方,这表示要评估的表达式,而不是字面上的输出。

于 2013-07-16T16:38:00.223 回答