создавать теги, только если значения найдены в XML - PullRequest
0 голосов
/ 08 марта 2011

Привет нужно создавать теги, только если значения найдены в XML

Я конвертирую XML в XML с использованием XSL Моя проблема состоит в том, чтобы создавать теги, только если значения найдены во входном 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>

ЕСЛИ НЕ ТОГДА: теги создавать нельзя

Ответы [ 5 ]

1 голос
/ 08 марта 2011

Но если вы исправите эту проблему, ваши результаты будут не такими, как вы хотите. Это будет

&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 голосов
/ 04 февраля 2014

Я хотел бы добавить это как комментарий, но, поскольку у меня недостаточно репутации, я не могу добавить комментарий к проголосовавшему ответу.

Обратите внимание, что в проголосовавшем ответе есть повторяющееся условие теста. Изменить: это было упомянуто как комментарий, а также в другом ответе.

<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">

Это проверяет, является ли значение пустым, следовательно, оно возвращает true, если somelement отсутствует, а также когда оно присутствует, но имеет пустое значение.

0 голосов
/ 08 марта 2011

Существует ряд проблем :

  1. Вы не создаете двухмерную разметку - просто одномерную строку.

  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 голосов
/ 08 марта 2011
<xsl:if test="string(rsm:Waybill/rsm:MessageHeaderDocument/ram:ID)">
     do your strange stuff..
</xsl:if>

Было бы true, если строковое значение ram:ID не является строкой нулевой длины.

0 голосов
/ 08 марта 2011

Если вы измените строку

<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 != ''">

, которая также должна проверить, есть ли значение для оперативной памяти: ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...