XPATH для копирования значения узла из предыдущего элемента - PullRequest
0 голосов
/ 19 октября 2019

Я надеялся получить помощь по XPATH, который я пытаюсь создать.

У меня есть следующая файловая структура в XML:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText></TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText></TargetText>
    </ResponseArea>
</Request>

Мне нужно скопировать значение узла SourceText и вставить его в следующий TargetText узел.

Итак, полученный XML-файл будет таким:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 2**</TargetText>
    </ResponseArea>
</Request>

У меня есть следующий XSL:

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

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>


<xsl:template match="TargetText">
    <ResponseText>
        <xsl:value-of select="preceding::SourceText"/>
    </ResponseText>
</xsl:template>


</xsl:stylesheet>

Но механизм XSL (MSXSL) копирует Текст 1 значение в оба последующих TargetText вместо использования каждого следующего SourceText значения в качестве источника для копируемого содержимого:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <TargetText>**Text 1**</TargetText>
    </ResponseArea>
</Request>

Любые предложения о том, что я делаю не так?

Спасибо!

1 Ответ

1 голос
/ 19 октября 2019

Просто замените второй шаблон в вашем XSLT на

<xsl:template match="ResponseArea/TargetText">
    <ResponseText>
        <xsl:value-of select="../../RequestArea/SourceText"/>
    </ResponseText>
</xsl:template>

Если вам нужно, чтобы элемент имел имя TargetText, как в желаемом примере вывода вместо ResponseText, просто измените его.

Вывод вышеуказанного кода:

<Request>
    <RequestArea>
        <SourceText>**Text 1**</SourceText>
    </RequestArea>
    <ResponseArea>
        <ResponseText>**Text 1**</ResponseText>
    </ResponseArea>
</Request>
<Request>
    <RequestArea>
        <SourceText>**Text 2**</SourceText>
    </RequestArea>
    <ResponseArea>
        <ResponseText>**Text 2**</ResponseText>
    </ResponseArea>
</Request>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...