使用XSL转换XML时添加命名空间

时间:2013-07-16 15:08:53

标签: xslt

我正在尝试使用XSL样式表使用Transform.xsl文件将Source.xml文件转换为Desired.xml格式。 我设法正确地转换它,除了节点中的namespace属性。 有谁知道我需要在xsl转换文件中添加该属性?

Desired.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>

Source.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>

Transform.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>

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

<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 。如果在属性中看到花括号{},则表示要计算的表达式,而不是字面上的输出。