Как выбрать значения с XSLT из неструктурированного XML с пронумерованными вхождениями - PullRequest
0 голосов
/ 09 января 2019

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

См. Пример ниже, где теги I3 и I4 связаны, если число «occ» (происшествие) одинаково между двумя тегами.

Тег I4 описывает тип значения, а I3 - фактическое значение. Например: «I3» occ = «1»> 123 относится к «I4» occ = «1» другой номер.

пример:

<field tag="I3" occ="1">123</field>
<field tag="I4" occ="1" lang="sv-SE" invariant="true">other number</field>
<field tag="I3" occ="2">324</field>
<field tag="I4" occ="2" lang="sv-SE" invariant="true">find number</field>
<field tag="I3" occ="3">1203</field>
<field tag="I4" occ="3" lang="sv-SE" invariant="true">FID</field>
<field tag="I3" occ="4">321-35-2000</field>
<field tag="I4" occ="4" lang="sv-SE" invariant="true">archive number</field>

Есть ли способ с XSLT 1.0, чтобы сделать этот тип операции выбора? Мои знания ограничены тем, как я мог бы выбрать, например, тег I3 с occ = 3, например:

<xsl:value-of select="field[@tag='I3' and @occ='4']" /></xsl:text>

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

Есть предложения? Спасибо за любой вклад!

Вывод, который я хочу, выглядит примерно так:

<data>other number: 123</data>
<data>find number: 324</data>
<data>FID: 1203</data>
<data>archive number: 321-35-2000</data> 

Обновлен вывод - я понял, что мне нужен каждый тег I4 в качестве имени элемента, в противном случае служба печати не может использовать строки в качестве источника для вывода на печать.

<?xml version="1.0" encoding="UTF-8"?>  
<output>  
  <variable name="other number">123</variable>  
  <variable name="find number">324</variable>  
  <variable name="FID">1203</variable>  
  <variable name="archive number">321-35-2000</variable>  
</output>

1 Ответ

0 голосов
/ 09 января 2019

Если вы можете быть уверены, что один из элементов пары всегда будет там, вы можете использовать этот элемент для своего первоначального выбора. Затем используйте ключ для извлечения другого члена пары (который может существовать или не существовать).

В этом примере мы предполагаем, что <field tag="I3"> всегда существует:

XML

<fields>
    <field tag="I3" occ="1">123</field>
    <field tag="I4" occ="1" lang="sv-SE" invariant="true">other number</field>
    <field tag="I3" occ="2">324</field>
    <field tag="I4" occ="2" lang="sv-SE" invariant="true">find number</field>
    <field tag="I3" occ="3">1203</field>
    <field tag="I4" occ="3" lang="sv-SE" invariant="true">FID</field>
    <field tag="I3" occ="4">321-35-2000</field>
    <field tag="I4" occ="4" lang="sv-SE" invariant="true">archive number</field>
</fields>

XSLT 1.0

<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"/>
<xsl:strip-space elements="*"/>

<xsl:key name="type" match="field[@tag='I4']" use="@occ" />

<xsl:template match="/fields">
    <output>
        <xsl:for-each select="field[@tag='I3']">
            <data>
                <xsl:value-of select="key('type', @occ)"/>
                <xsl:text>: </xsl:text>
                <xsl:value-of select="."/>
            </data>
        </xsl:for-each>
    </output>
</xsl:template>

</xsl:stylesheet>

Результат

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <data>other number: 123</data>
  <data>find number: 324</data>
  <data>FID: 1203</data>
  <data>archive number: 321-35-2000</data>
</output>

Добавлено:

Если вы измените:

            <data>
                <xsl:value-of select="key('type', @occ)"/>
                <xsl:text>: </xsl:text>
                <xsl:value-of select="."/>
            </data>

до:

            <variable name="{key('type', @occ)}">
                <xsl:value-of select="."/>
            </variable>

результат будет:

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <variable name="other number">123</variable>
  <variable name="find number">324</variable>
  <variable name="FID">1203</variable>
  <variable name="archive number">321-35-2000</variable>
</output>

Читать о шаблонах значений атрибутов .

...