Как разобрать значение узла с одного узла, который рефферирует с другого узла в xsl? - PullRequest
1 голос
/ 28 ноября 2011

Заранее спасибо тем, кто ответит, потому что я много гуглю, но не повезло, и я также новичок в XSL. Предоставлено XML

<Parameterdef>
<Anode>
    <Anodeid>1</Anodeid>
</Anode>
<Bnode>
    <Bnodeid>2</Bnodeid>
</Bnode>
<ParameterVisualization>
    <ParameterDefinition>
        <ParameterSection>Anode</ParameterSection>
        <Parameter>Anodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Bnode</ParameterSection>
        <Parameter>Bnodeid</Parameter> 
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Cnode</ParameterSection>
        <Parameter>Cnodeid</Parameter> 
    </ParameterDefinition>
</ParameterVisualization>
</Parameterdef>

Зависит от значения узла, мне нужно разобрать xml отверстия и мне нужно получить значение этого узла, если этот узел существует.

Require OutPut: 1,2, N / A (потому что Cnode не определен)

Ответы [ 2 ]

0 голосов
/ 28 ноября 2011

Это короткое преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="ParameterDefinition">
   <xsl:variable name="vThis" select="."/>
     <xsl:variable name="vRes" select=
      "/*/*[name()=$vThis/ParameterSection]
                   /*[name()=$vThis/Parameter]
   "/>

   <xsl:if test="not(position()=1)">,</xsl:if>
   <xsl:value-of select=
     "concat($vRes,
             substring('N/A',
                       1 div (string-length($vRes) = 0)
                       )
             )"/>
 </xsl:template>
 <xsl:template match="text()"/>
</xsl:stylesheet>

при применении к (исправленному) предоставленному XML-документу :

<Parameterdef>
<Anode>
    <Anodeid>1</Anodeid>
</Anode>
<Bnode>
    <Bnodeid>2</Bnodeid>
</Bnode>
<ParameterVisualization>
    <ParameterDefinition>
        <ParameterSection>Anode</ParameterSection>
        <Parameter>Anodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Bnode</ParameterSection>
        <Parameter>Bnodeid</Parameter>
    </ParameterDefinition>
    <ParameterDefinition>
        <ParameterSection>Cnode</ParameterSection>
        <Parameter>Cnodeid</Parameter>
    </ParameterDefinition>
</ParameterVisualization>
</Parameterdef>

дает требуемый, правильный результат :

1,2,N/A

Пояснение :

Использование стандартной функции XPath name().

0 голосов
/ 28 ноября 2011

Функции XPath name() и local-name() могут использоваться для чтения имени неизвестного элемента.Затем они сравниваются со значениями элементов в предикате.Я предполагаю, что строка </MLinkParameterDefinition> в вашем примере кода была ошибкой ввода, а вместо нее подразумевалось </ParameterDefinition>.В этом решении и <ParameterSection>, и <Parameter> должны иметь значение, соответствующее элементу, оно также проверяет, что значение id-элементов должно быть не пустым.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
    <xsl:apply-templates select="*/ParameterVisualization/ParameterDefinition"/>
</xsl:template>

<xsl:template match="ParameterDefinition">
    <xsl:variable name="nodeId" select="/*/*[local-name() = current()/ParameterSection]
                                            /*[local-name() = current()/Parameter]
                                              [normalize-space()]"/>
        <xsl:choose>
            <xsl:when test="$nodeId">
                <xsl:value-of select="$nodeId"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>N/A</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:if test="following-sibling::ParameterDefinition">
            <xsl:text>,</xsl:text>
        </xsl:if>
</xsl:template>

</xsl:stylesheet>

Вывод с вашим (исправлено) пример ввода

1,2,N/A

Нет пробела между запятыми и запятой после последнего значения.

Почему-то я чувствую, что ключи должны использоваться в подобных проблемах сопоставления, но для меня это казалосьболее простой способ решения проблемы.

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