2015-08-27 2 views
0

Я хочу преобразовать и фильтровать xml-файл с помощью xsl, но у меня есть проблема. Если я попытаюсь получить значение атрибута от узла, переменная var_value также является узлом. На мой взгляд, это причина, по которой я не могу сравнивать var_value с любой строкой. Я прав?Чтение значения атрибута из XML

XML файла:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Body> 
    <GetListItemsResponse> 
     <GetListItemsResult> 
     <listitems xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> 
      <rs:data ItemCount="1"> 
      <z:row ows_ID="1" ows_Status0="Active" ows_Priority="3" ows_Criticality="Critical" /> 
      </rs:data> 
     </listitems> 
     </GetListItemsResult> 
    </GetListItemsResponse> 
    </soap:Body> 
</soap:Envelope> 

XSLT:

<xsl:variable name="ar_Fields"> 
    <Field>ows_Status0</Field> 
</xsl:variable> 

<xsl:template match="/" name="TransformFields"> 
<xsl:param name="param_Attribute"/><xsl:variable name="var_EmptyDate" select="'1900-01-01 00:00:00'"/> 
     <xsl:for-each select="//*['z:row']/@*"> 
     <xsl:variable name="var_Name" select="name()"></xsl:variable> 
     <xsl:variable name="var_Value"><xsl:value-of select="string(.)"></xsl:value-of></xsl:variable> 
     <xsl:for-each select="$ar_Fields"> 
      <xsl:if test="not($var_EmptyDate=$var_Value) and ($var_Name=$ar_Fields/.)"> 
       <xsl:call-template name="CreateElement"> 
        <xsl:with-param name="param_Name" select="$var_Name"/> 
        <xsl:with-param name="param_Value" select="$var_Value"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:for-each> 
     </xsl:for-each> 
</xsl:template> 

<xsl:template name="CreateElement"> 
    ... 
</xsl:template> 

Результат должен выглядеть следующим образом: <Field Name="Status0">Active</Field>

+0

Вы получаете сообщение об ошибке или сравниваете почему вы не можете сравнивать var_value с любой строкой? Какую ошибку вы получаете? Что означает '// * ['z: row']' предполагается выбрать? Непустая строка, такая как '' z: row'', сделает предикат истинным в любом случае. –

+0

Нет. Я не получаю сообщение об ошибке, но если я попытаюсь сравнить узел с определенной строкой, например. var_value - это набор узлов с содержимым (Status0, Active), затем '' возвращает false. – Michelle

+0

Можете ли вы показать полный ожидаемый выходной документ? –

ответ

1

Я не был в состоянии следовать код. Не может ли это быть просто:

XSLT 2,0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:z="#RowsetSchema" 
exclude-result-prefixes="z"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:variable name="ar_Fields"> 
    <Field>ows_Status0</Field> 
</xsl:variable> 

<xsl:template match="/"> 
    <Field Name="Status0"> 
     <xsl:value-of select="//z:row/@*[name()=$ar_Fields/Field]"/> 
    </Field> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо, но я хочу создать узел для каждого атрибута z: row. Он должен выглядеть следующим образом: '<Имя поля =" AttributeName "> AttributeValue'. Это работает, но я не могу проверить, пусто ли это значение. – Michelle

+0

Боюсь, я не следую. Создание узла для каждого атрибута z: строки очень просто. Что это связано с переменной? И что вы подразумеваете под «проверить, пусто ли значение»? Это тоже легко, но что вы хотите в результате? Кроме того, в вашем примере z: row имеет 4 атрибута, но ваш результат имеет только один узел. –

1

Я подозреваю, что ваша ошибка в строке

<xsl:for-each select="//*['z:row']/@*"> 

Я не знаю, что вы хотели это сделать, но предикат ['z:row'] бесполезен - истинное значение булевой строки строки 'z:row'. Возможно, вы имели в виду, что предикат должен быть [self::z:row]? Но в таком случае, почему ты не написал select="//z:row/@*"?

В любом случае ваша теория неверна. Сравнение узла со строкой отлично работает (узел неявно распыляется).

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