2013-09-12 3 views
0

Я видел несколько примеров различных способов проверить, существует ли значение (узел) в списке (повторяющаяся переменная XML), но по какой-то причине я не могу понять точный синтаксис оператора Xpath, который я должен использовать. У меня есть один XML-документ, который представляет собой список строк счетов, а другой документ XML - список неправильных строк. Если во втором документе существует значение в первом документе, мне нужно поставить/заменить его значением «X», в противном случае оставить пустым.XSLT-XPath: проверьте, существует ли значение в списке

Здесь входной образец документ

Input1

<?xml version="1.0" encoding="UTF-8"?> 
<UPSOutboundFlatFileSchema> 
    <data> 
     <processFlag>1</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag>2</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag>3</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag>4</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
</UPSOutboundFlatFileSchema> 

Input2

<?xml version="1.0" encoding="UTF-8"?> 
<rows> 
    <row> 
     <LineNumber>2</LineNumber> 
    </row> 
    <row> 
     <LineNumber>3</LineNumber> 
    </row> 
</rows> 

Выходной документ

<?xml version="1.0" encoding="UTF-8"?> 
<UPSOutboundFlatFileSchema> 
    <data> 
     <processFlag></processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag>X</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag>X</processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
    <data> 
     <processFlag></processFlag> 
     <field1>...</field1> 
     <field2>...</field2> 
    </data> 
</UPSOutboundFlatFileSchema> 

Вот XSLT У меня есть до сих пор, я просто не могу не получить XPath заявление на первом «когда тест =» правильный ...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <xsl:output indent="yes"/> 
    <xsl:variable name="rejectLines" select="bpws:getVariableData('UPSDataRejectLineNumbers')"/> 
    <xsl:variable name="input" select="/"/> 

    <xsl:template match="/"> 

     <xsl:element name="UPSOutboundFlatFileSchema">  
      <xsl:for-each select="$input/*:UPSOutboundFlatFileSchema/*:data"> 
       <xsl:element name="data"> 
        <xsl:choose> 
         <xsl:when test="boolean($rejectLines/*:rows/*:row/*:LineNumber = processFlag"> 
          <xsl:element name="processFlag"> 
           <xsl:value-of select="X"/> 
          </xsl:element> 
         </xsl:when> 
         <xsl:otherwise> 
          <xsl:element name="processFlag"> 
           <xsl:value-of select="''"/> 
          </xsl:element>     
         </xsl:otherwise> 
        </xsl:choose> 
        <xsl:copy-of select="child::*[not(self::processFlag)]"/> 
       </xsl:element> 
      </xsl:for-each> 
     </xsl:element>  
    </xsl:template> 

</xsl:stylesheet> 

ответ

3

Не пинать себя слишком трудно, но там, где у вас есть <xsl:value-of select="X"/> вам нужно <xsl:text>X</xsl:text>. В ваших входных данных нет элемента с именем X.

И пока вы на нем, для вас в противном случае вам просто нужно <xsl:element name="processFlag"/>.

Нет необходимости в <xsl:value-of/>, если все, что у вас есть, является аргументом одной строки.

+0

Ну, это имеет смысл ... Я определенно переусердствовал (и имел право Xpath для начала). Урок узнал наверняка, еще раз спасибо за помощь Кен! – rwolters3

Смежные вопросы