Как настроить таргетинг на конкретный узел в документе XML с помощью XSLT? - PullRequest
2 голосов
/ 24 октября 2011

Ниже приведена сокращенная версия XML-файла, предоставленного другим подразделением. Мне нужно получить значение DriverInputSetGoodStudent .

Вот как я подхожу к этому:

//session/data/policy/line/child::vehicle[position()=1]

Это дает мне первое транспортное средство в XML, поэтому я буду знать идентификатор водителя этого транспортного средства на основе GoulingDriverIdInfo / ItemId . Затем мне нужно сопоставить этот идентификатор со свойством id узла driver . Затем получите значение узла DriverInputSetGoodStudent .

<session>
<data>
    <policy>
        <line>
            <driver id="d4A5D51CEC4C14D3C9754A59AE09EFF9B" deleted="0" description="OH Edge, Teresa / 321654654">
                <DriverTrainingInd>N</DriverTrainingInd>
                <DriverInputGoodStudent>N</DriverInputGoodStudent>
                <DriverInputSetDriverTraining>0</DriverInputSetDriverTraining>
                <DriverInputSetGoodStudent>0</DriverInputSetGoodStudent>
                <DriverInputAccidentPreventionTrainingDate>2011-05-05</DriverInputAccidentPreventionTrainingDate>
                <AccidentPreventionCourse>0</AccidentPreventionCourse>
                <AccidentPreventionCoursePreviousValue>0</AccidentPreventionCoursePreviousValue>
                <DriverTrainingPrevValue>0</DriverTrainingPrevValue>
                <DriverOutputGoodStudent>No</DriverOutputGoodStudent>
            </driver>
            <vehicle id="v1CFDF4006D7C41D8B8C8A510E4C5C2E1" deleted="0" description="TYTA CAMRY BASE/LE/SE/XLE, 2010, 4T1BF3EK3AU522985">
                <VehicleInputPrimaryDriver>d4A5D51CEC4C14D3C9754A59AE09EFF9B</VehicleInputPrimaryDriver>
                <GoverningDriverIdInfo>
                  <ItemIdList>d4A5D51CEC4C14D3C9754A59AE09EFF9B</ItemIdList>
                  <ItemId>d4A5D51CEC4C14D3C9754A59AE09EFF9B</ItemId>
                </GoverningDriverIdInfo>
                <PrimaryDriverID>d4A5D51CEC4C14D3C9754A59AE09EFF9B</PrimaryDriverID>
                <VehicleGoodStudent>No</VehicleGoodStudent>
                <VehicleDriverTraining>No</VehicleDriverTraining>
            </vehicle>
        <line>
    <policy>
<data>
<session>

Я вижу, что код вставлен не совсем корректно, в блоке кода отсутствует тег "end session". Заранее благодарим за помощь.

1 Ответ

1 голос
/ 24 октября 2011

Если у вас есть идентификатор где-то:

<xsl:variable name="driverID" select="data/policy/line/child::vehicle[position()=1]/GoverningDriverIdInfo/ItemId"/>

Вы можете просто использовать его, чтобы найти нужный узел:

<xsl:variable name="targetNode" select="data/policy/line/driver[@id = $driverID]/DriverInputSetGoodStudent"/>

Обновить ответ:

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

  <xsl:template match="/">
    <xsl:for-each select="//session">
      <xsl:message terminate="no">
        <xsl:value-of select="data/policy/line/driver[@id = current()/data/policy/line/child::vehicle[position()=1]/GoverningDriverIdInfo/ItemId]/DriverInputSetGoodStudent"/>
      </xsl:message>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

Вывод:

 [xslt] : Warning! 0

Где 0 - это значение вашего желаемого узла.Переменные не используются.Я думал, что было ясно, как объединить две переменные, которые использовались только для доказательства концепции.

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