2012-02-14 68 views
1

我正在使用两个不同的xslt处理器。 其中一个创建了一个目标中不为空的元素(即使该元素在源中为空)。如何编写将映射的xsl <xsl:text></xsl:text>

为了说明问题,我如何通过我的xsl告诉处理器 该元素应该在target中创建为空? (换句话说,如何映射到该元素)。

编辑: 要clearify我的问题 - 我使用“的Altova MapForce的”映射工具,我映射节点到节点。 产生的xml(使用altova xslt处理器)没有非空的节点。 结果xml(使用biztalk xslt处理器,使用Altova Mapforce生成的xsl)使用非空的节点。 源上的节点是空的。

我的目标是将源节点(使用Altova MapForce映射工具)连接到自定义写入的XSLT,然后将其连接到目标。

这里是我的代码: in.xml - 用于执行地图实例输入(请注意空ID标签:)

<ns0:Root xmlns:ns0="http://BizTalk_Server_Project1.Schema1"> 
    <id root="root_0" extension="extension_1" /> 
</ns0:Root> 

Schema1.xsd - 源和目标模式

<?xml version="1.0" encoding="utf-16"?> 
<xs:schema xmlns="http://BizTalk_Server_Project1.Schema1" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://BizTalk_Server_Project1.Schema1" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Root"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="id"> 
      <xs:complexType> 
      <xs:attribute name="root" type="xs:string" /> 
      <xs:attribute name="extension" type="xs:string" /> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
由的Altova生成XSL -

New.mfd - Altova的映射文件

<?xml version="1.0" encoding="UTF-8"?> 
<mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="19"> 
    <component name="defaultmap1" blackbox="0" uid="1" editable="1"> 
     <properties SelectedLanguage="xslt"/> 
     <structure> 
      <children> 
       <component name="document" library="xml" uid="4" kind="14"> 
        <properties/> 
        <view rbx="150" rby="200"/> 
        <data> 
         <root> 
          <header> 
           <namespaces> 
            <namespace/> 
            <namespace uid="http://BizTalk_Server_Project1.Schema1"/> 
            <namespace uid="http://www.altova.com/mapforce"/> 
           </namespaces> 
          </header> 
          <entry name="FileInstance" ns="2" expanded="1"> 
           <entry name="document" ns="2" expanded="1" casttotargettypemode="cast-in-subtree"> 
            <entry name="Root" ns="1" expanded="1"> 
             <entry name="id" expanded="1"> 
              <entry name="extension" type="attribute" outkey="4"/> 
             </entry> 
            </entry> 
           </entry> 
          </entry> 
         </root> 
         <document schema="Schema1.xsd" outputinstance="Schema1.xml" instanceroot="{http://BizTalk_Server_Project1.Schema1}Root"/> 
         <wsdl/> 
        </data> 
       </component> 
       <component name="document" library="xml" uid="5" kind="14"> 
        <properties XSLTDefaultOutput="1"/> 
        <view ltx="593" rbx="743" rby="200"/> 
        <data> 
         <root> 
          <header> 
           <namespaces> 
            <namespace/> 
            <namespace uid="http://BizTalk_Server_Project1.Schema1"/> 
            <namespace uid="http://www.altova.com/mapforce"/> 
           </namespaces> 
          </header> 
          <entry name="FileInstance" ns="2" expanded="1"> 
           <entry name="document" ns="2" expanded="1" casttotargettypemode="cast-in-subtree"> 
            <entry name="Root" ns="1" expanded="1"> 
             <entry name="id" expanded="1"> 
              <entry name="extension" type="attribute" inpkey="5"/> 
             </entry> 
            </entry> 
           </entry> 
          </entry> 
         </root> 
         <document schema="Schema1.xsd" outputinstance="Schema1.xml" instanceroot="{http://BizTalk_Server_Project1.Schema1}Root"/> 
         <wsdl/> 
        </data> 
       </component> 
      </children> 
      <graph directed="1"> 
       <edges/> 
       <vertices> 
        <vertex vertexkey="4"> 
         <edges> 
          <edge vertexkey="5" edgekey="6"/> 
         </edges> 
        </vertex> 
       </vertices> 
      </graph> 
     </structure> 
    </component> 
</mapping> 

Xsl.xsl映射

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns0="http://BizTalk_Server_Project1.Schema1" xmlns:agt="http://www.altova.com/Mapforce/agt" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="ns0 agt xs"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template name="agt:var2_MapToSchema1_function"> 
     <xsl:param name="par0"/> 
     <xsl:attribute name="extension"> 
      <xsl:value-of select="string($par0/@extension)"/> 
     </xsl:attribute> 
    </xsl:template> 
    <xsl:template match="/"> 
     <Root xmlns="http://BizTalk_Server_Project1.Schema1"> 
      <xsl:attribute name="xsi:schemaLocation" namespace="http://www.w3.org/2001/XMLSchema-instance">http://BizTalk_Server_Project1.Schema1 C:/Users/OhadAv/Desktop/ForAltova/Schema1.xsd</xsl:attribute> 
      <id xmlns=""> 
       <xsl:for-each select="ns0:Root/id"> 
        <xsl:variable name="var1_extension"> 
         <xsl:if test="@extension"> 
          <xsl:value-of select="'1'"/> 
         </xsl:if> 
        </xsl:variable> 
        <xsl:if test="string(boolean(string($var1_extension))) != 'false'"> 
         <xsl:call-template name="agt:var2_MapToSchema1_function"> 
          <xsl:with-param name="par0" select="."/> 
         </xsl:call-template> 
        </xsl:if> 
       </xsl:for-each> 
      </id> 
     </Root> 
    </xsl:template> 
</xsl:stylesheet> 

GeneratedByBizTalkMapperAfterXSLTmap.xml - 使用“Xsl.xsl”供图(请注意编辑XML文件时,已生成的非空ID标签后,在BizTalk映射器的输出实例:

<?xml version="1.0" encoding="utf-8"?> 
<Root xsi:schemaLocation="http://BizTalk_Server_Project1.Schema1 C:/Users/OhadAv/Desktop/ForAltova/Schema1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://BizTalk_Server_Project1.Schema1"> 
    <id extension="extension_1" xmlns=""> 
    </id> 
</Root> 
+1

你没有尽到你的 “功课”:没有源XML ,没有XSLT代码(请尽可能简单和尽可能完整),没有想要的结果,也没有实际的结果......请编辑并将此猜测练习变成真正的问题。 – 2012-02-14 13:08:40

+1

@DimitreNovatchev,我同意你的意见。 – 2012-02-14 13:30:53

+0

你好。感谢您的亲切帮助。 我已将您的问题延伸至您的要求。 – ohadinho 2012-02-14 15:26:04

回答

2

这可能是因为您的输入XML元素中有一个空格。strip-space的使用应该会完成您的工作!

此撕断节点之间的空间:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:strip-space elements="YourElement" /> 
<!--Your code here--> 

输入XML:

<a> 
    <b> </b> 
<a> 

输出XML:

<a> 
    <b/> 
</a> 

这保留节点之间的空间:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:preserve-space elements="YourElement" /> 
<!--Your code here--> 

如果你想申请相同的规则对所有的元素,然后

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:preserve-space elements="*" /> 

源XML:

<a> 
    <b> </b> 
</a> 

输出XML:

<a> 
    <b> </b> 
<a> 
+0

标题声明与此无关:) – 2012-02-14 11:10:07

+0

您的解决方案不适用于biztalk地图处理器。 – 2012-02-14 11:55:17

+0

@Haim,请提供相应的示例XML和期望的输出,我已根据提问者的句子提出了此答案。我不确定您的案例中的交易是什么。 – 2012-02-14 13:18:16

1

下转型演示了两种不同的方法创建空元素

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <t> 
     <a> 
     <b/> 
     </a> 
     <a> 
     <xsl:element name="b"/> 
     </a> 
    </t> 
</xsl:template> 
</xsl:stylesheet> 

使用7种不同的XSLT(MSXML3。 MSXML4,MSXML6,.NET XslCompiledTransform,.NET的XslTransform,撒克逊6.5.4和AltovaXML(XML-SPY)处理器包含两个独立的<b/>元素

<t> 
    <a> 
     <b/> 
    </a> 
    <a> 
     <b/> 
    </a> 
</t> 
相关问题