Условное значение выбора для повторяющихся узлов - PullRequest
0 голосов
/ 13 апреля 2019

Я новичок в использовании XSLT и столкнулся с проблемой с одной из моих программ. Я пытался решить эту проблему с моими ограниченными знаниями, но безрезультатно. Я пытаюсь обработать файл XML, чтобы получить только американские части. Данные содержат как китайскую, так и американскую части. Данные содержатся в повторяющихся узлах.

Я пробовал использовать условные операторы, чтобы ограничить выбор только получением идентификатора детали из США. Однако я получаю идентификаторы для всех частей.

Это образец входного файла XML:

<Part>
            <Part_ID>Comp-97531</Part_ID>
            <Country>US</Country>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>12345678909876</ID>
        <ID_Type>CHN-1</ID_Type>
    <Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>123456789</ID>
        <ID_Type>CHN-2</ID_Type>
    </Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>13579</ID>
        <ID_Type>CHN-3</ID_Type>
    </Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>555555555</ID>
        <ID_Type>USA-1</ID_Type>
    </Identification_Data>
</Part>

    <Part>
            <Part_ID>Comp-95137</Part_ID>
            <Country>US</Country>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>1234567812345</ID>
        <ID_Type>CHN-1</ID_Type>
    <Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>987654321</ID>
        <ID_Type>CHN-2</ID_Type>
    </Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>246810</ID>
        <ID_Type>CHN-3</ID_Type>
    </Identification_Data>
    <Identification_Data>
        <Product>Finished</Product>
        <ID>777777777</ID>
        <ID_Type>USA-1</ID_Type>
    </Identification_Data>
</Part>

Это код XSLT, который я пытаюсь:

<xsl:template match="/">
            <FILE>
        <xsl:for-each select="Part">
            <xsl:call-template name="ProductRecord"/>
        </xsl:for-each>
    </FILE>
</xsl:template>

<xsl:template name="ProductRecord">
        <ID>
      <xsl:choose>
            <xsl:when test="Country = 'US'">
          <xsl:if test="Identification_Data/ID_Type='USA-1'">
            <xsl:value-of select="Identification_Data/ID"/>
          </xsl:if>
        </xsl:when>
      </xsl:choose>
    </ID>
</xsl:template>

Требуется получить только детали, изготовленные в США с ID_TYPE = USA-1. Используя код XSLT, я ожидаю только значения для ID_Type = USA-1, которые будут 555555555. Однако вывод, который я получаю, выглядит следующим образом:

  12345678909876 123456789 13579 555555555.

Как я могу ограничить выбор, чтобы показывать только данные, специфичные для США? Заранее спасибо за ваш ответ.

1 Ответ

0 голосов
/ 13 апреля 2019

Прежде чем начать возиться с инструкциями XSLT, вы должны начать понимать XPath как язык выражений, и там вы можете просто выбрать //Part[Country = 'US'], чтобы выбрать Part элементы, для которых условие Country = 'US' в предикате [Country = 'US'] Hold.

Затем с выбранными Part элементами в качестве узла контекста вы можете выбрать Identification_Data[ID_Type = 'USA-1']/ID, чтобы выбрать ID дочерний элемент (элементы) Identification_Data элементов, для которых условие ID_Type = 'USA-1' верно.

Чтобы использовать эти выражения XPath в XSLT, вы можете просто использовать

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:template match="root">
     <xsl:apply-templates select="Part[Country = 'US']"/>
  </xsl:template>

  <xsl:template match="Part">
      <xsl:copy-of select="Identification_Data[ID_Type = 'USA-1']/ID"/>
  </xsl:template>

</xsl:stylesheet>

Пример на https://xsltfiddle.liberty -development.net / 94rmq6q / 1 .

Так что не нужно никаких xsl:call-template или xsl:choose, достаточно простого выбора XPath и шаблонов совпадений.

Обратите внимание, что мне пришлось исправить некоторые из ваших входных разметок, а также ввел rootконтейнер элементов для элементов Part, как правило, вход XSLT - это правильно сформированный документ XML, а не последовательность Part или других элементов.

...