只有在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:不应该创建标签
答案 0 :(得分:1)
但如果您解决了这个问题,那么您的输出将不是您想要的。它将是
<ROUTING>
<ORIGIN>
<STATION>
01463898855
</STATION>
</ORIGIN>
</ROUTING>
您需要更深入地了解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)
存在许多问题:
您不是在创建二维标记 - 只是一维字符串。
在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>
<强>解释强>:
元素(文字结果元素)实际上是作为元素创建的,而不是字符串。
使用单独的<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,但值为空。