2011-03-08 82 views
0

嗨發現需要創建標籤只有當值在XML中找到創建標籤只有當值在XML

我使用XSL 我的問題是創建標籤轉換XML到XML僅如果發現價值在輸入XML中。 我提到很多東西,並創建XSL,但不工作,你可以幫我。 謝謝!

輸入XML:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<?xml-stylesheet type="text/xsl" href= "D:\Vignesh\Task\RFC\FIS107_24Feb1\MyChanges\XSL SHEET\ThirdIP-HostIP.xsl"?> 
<rsm:Waybill  xmlns:ccts="urn:un:unece:uncefact:documentation:standard:CoreComponentsTechnicalSpecificati on:2" xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:8" 
xmlns:rsm="iata:waybill:1" xmlns:ram="iata:datamodel:3"> 
<rsm:MessageHeaderDocument> 
<ram:ID>01463898855</ram:ID> 
<rsm:MessageHeaderDocument> 
</rsm:Waybill> 

我的XSL:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!-- Edited by XMLSpy® --> 
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  xmlns:ccts="urn:un:unece:uncefact:documentation:standard:CoreComponentsTechnicalSpecification:2"    xmlns:udt="urn:un:unece:uncefact:data:standard:UnqualifiedDataType:8" 
     xmlns:rsm="iata:waybill:1"   xmlns:ram="iata:datamodel:3"> 
<xsl:output method="xml" indent="yes" ></xsl:output> 

<xsl:template match="/"> 

    <xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID"> 
     <xsl:text><![CDATA[<ROUTING>]]></xsl:text> 
     <xsl:text><![CDATA[<ORIGIN>]]></xsl:text> 
     <xsl:text><![CDATA[ <STATION> ]]></xsl:text> 
     <xsl:value-of select="/rsm:Waybill/rsm:MasterConsignment/ram:OriginLocation/ram:ID"/> 
     <xsl:text><![CDATA[</STATION> ]]></xsl:text> 
     <xsl:text><![CDATA[</ORIGIN>]]></xsl:text> 
    </xsl:if> 

</xsl:template> 
</xsl:stylesheet> 

我的輸出將是像 如果值是在衝壓:ID,則:

<ROUTING> 
    <ORIGIN> 
    <STATION> 
     01463898855 
    <STATION> 
    </ORIGIN> 
</ROUTING> 

如果沒有,那麼:不應創建標籤

回答

0

如果您更改行

<xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID">

<xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID and rsm:Waybill/rsm:MessageHeaderDocument/ram:ID != ''"> 

也應該測試是否有對RAM的值:ID

+0

你並沒有解決所有主要的,最糟糕的問題 - 請參閱@ Michael-Kay的答案。 –

+0

是的,你說得對。對不起,我錯過了一切都在文本和CDATA我只是集中在這裏的條件@Vignesh你真的應該看看凱先生的答案在這裏。我的答案解決了這個問題,但不能解決XML Output的其他明顯問題。 – Chris

+0

通過節點集比較,存在測試是多餘的。 – 2011-03-08 17:50:34

0
<xsl:if test="string(rsm:Waybill/rsm:MessageHeaderDocument/ram:ID)"> 
    do your strange stuff.. 
</xsl:if> 

這將是true如果字符串值ram:ID不是零長度字符串。

+0

+1這也是正確的。如果你這樣做,你也可以使用'normalize-space()'函數。 – 2011-03-08 17:52:42

1

但是,如果你解決了這個問題,你的輸出將不會是你想要的。它將是

&lt;ROUTING&gt; 
    &lt;ORIGIN&gt; 
    &lt;STATION&gt; 
     01463898855 
    &lt;/STATION&gt; 
    &lt;/ORIGIN&gt; 
&lt;/ROUTING&gt; 

您需要更深入地瞭解XSLT的全部內容。或者,如果你只是想解決它沒有獲得一個更深入的瞭解,把它改寫爲

<xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID != ''"> 
    <ROUTING> 
    <ORIGIN> 
     <STATION> 
     <xsl:value-of select="/rsm:Waybill/rsm:MasterConsignment/ram:OriginLocation/ram:ID"/> 
     </STATION> 
    </ORIGIN> 
    </ROUTING> 
</xsl:if> 
+0

+1正確的完整答案。 – 2011-03-08 17:48:32

0

有許多的問題

  1. 沒有創建2維標記 - 只是一維字符串。

  2. 如果可能,最好避免使用XSLT條件指令。

一種可能的解決這兩個問題:

<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="rsm:MessageHeaderDocument[ram:ID]"> 
    <ROUTING> 
     <ORIGIN> 
      <STATION> 
       <xsl:value-of select= 
       "/*/rsm:MasterConsignment/ram:OriginLocation/ram:ID"/> 
      </STATION> 
     </ORIGIN> 
    </ROUTING> 
</xsl:template> 
</xsl:stylesheet> 

說明

  1. 元素(文字結果元素)被創建真如元件,而不是作爲串。

  2. 使用帶模式匹配的單獨<xsl:template>可以避免在模板正文內部使用條件xslt指令。

0

我想將此添加爲評論,但因爲我沒有足夠的聲望,我無法對已投票答案添加評論。

請注意,投票答案有重複的測試條件。 編輯:這是作爲評論和另一個答案中提到的。

<xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID and rsm:Waybill/rsm:MessageHeaderDocument/ram:ID != ''"> 

的解決方案是,

<xsl:if test="rsm:Waybill/rsm:MessageHeaderDocument/ram:ID != ''"> 

我已經測試此。

<xsl:if test="someelement!=''">將檢查如果<someelement>存在,以及該元素有一個值。

<xsl:if test="someelement">將檢查僅如果<someelement>是本

也有是

<xsl:if test="string-length(someelement)=0"> 

這用來檢查值是空的,因此,如果somelement不存在,以及返回true當它存在時,但有一個空值。