我正在尝试使用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>
提前致谢。
答案 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 。如果在属性中看到花括号{},则表示要计算的表达式,而不是字面上的输出。