仅在XML中找到值时才创建标记

时间:2011-03-08 11:25:25

标签: xml xslt

只有在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>

我的输出就像 如果值在ram中:ID则:

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

iF NOT THEN:不应该创建标签

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

的值

答案 2 :(得分:0)

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

如果true的字符串值不是零长度字符串,则为ram:ID

答案 3 :(得分:0)

存在许多问题

  1. 您不是在创建二维标记 - 只是一维字符串。

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

  3. 解决这两个问题的可能方法之一:

    <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指令。

答案 4 :(得分: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,如果该值存在,则返回true,但值为空。