2012-02-14 72 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> 
相關問題