Получать данные из разных полей, где ориентир является символом - PullRequest
1 голос
/ 21 февраля 2011

У меня есть данные, которые выглядят так:

<line id="1">
<field id="1">324</field id="1">
<field id="2">abc</field id="2">
.................................
.................................
.................................
<field id="11">324321</field id="11">
<field id="12"
 ><![CDATA[6256812+0000140000000990000000000009900000000004058002C]]></field>
</line id="1">
<line id="2">
<field id="1">324</field id="1">
<field id="2">abc</field id="2">
.................................
.................................
.................................
<field id="8">324321</field id="11">
<field id="9"
 ><![CDATA[6256813+0000040000000890000000000008900000000003648002C]]></field>
</line id="2">
<line id="3">
<field id="1">324fsf</field id="1">
<field id="2">abcdf</field id="2">
.................................
.................................
.................................
<field id="12">32432s1</field id="11">
<field id="13"
 ><![CDATA[6256812+0000060000000750000000000007500000000003074002C]]></field>
</line id="3">
<line id="4">
<field id="1">3fsfa24</field id="1">
<field id="2">abasc</field id="2">
.................................
.................................
.................................
<field id="18">32fasf4321</field id="11">
<field id="19"
 ><![CDATA[6256837+0000010000000650000000000006500000000002664003C]]></field>
</line id="5">

Мне нужно взять номер перед ориентиром '+'.

<xsl:choose>
 <xsl:when test="string(field[@id='9'])">
    <xsl:value-of select="number(substring(field[@id='10'], 1,7))"/>
 </xsl:when>
 <xsl:when test="string(field[@id='11'])">
    <xsl:value-of select="number(substring(field[@id='12'], 1,7))"/>
 </xsl:when>
 <xsl:when test="string(field[@id='17'])">
    <xsl:value-of select="number(substring(field[@id='17'], 1,7))"/>
 </xsl:when>
</xsl:choose>

может быть, есть более правильное решение?

Ответы [ 3 ]

2 голосов
/ 21 февраля 2011

Правильный способ XSLT сделать это (обработка в стиле push):

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


 <xsl:template match="field[contains('|9|13|19|', concat('|',@id, '|'))]">
  <xsl:value-of select="substring-before(.,'+')"/>
  <xsl:text>&#xA;</xsl:text>
 </xsl:template>

 <xsl:template match="text()"/>
</xsl:stylesheet>

, когда это преобразование применяется к предоставленному документу XML (исправлено изсерьезно деформирован):

<t>
    <line id="1">
        <field id="12"><![CDATA[6256812+0000140000000990000000000009900000000004058002C]]></field>
    </line>
    <line id="2">
        <field id="9"><![CDATA[6256813+0000040000000890000000000008900000000003648002C]]></field>
    </line>
    <line id="3">
        <field id="13"><![CDATA[6256812+0000060000000750000000000007500000000003074002C]]></field>
    </line>
    <line id="4">
        <field id="19"><![CDATA[6256837+0000010000000650000000000006500000000002664003C]]></field>
    </line>
</t>

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

6256813
6256812
6256837

Примечание : нет дажеодна условная инструкция xslt в преобразовании.

1 голос
/ 21 февраля 2011

Используйте функцию substring-before. Вы можете использовать его, чтобы получить текст до первого +

Я бы также рекомендовал использовать отдельный шаблон для каждого условия:

<xsl:template match="field[@id='9']">
  <xsl:value-of select="substring-before(../field[@id='10'],'+')" />
</xsl:template>

Или что-то похожее в зависимости от контекста.

0 голосов
/ 21 февраля 2011

Похоже, плохой, хрупкий дизайн для меня.Если вы собираетесь полагаться на позиционную логику для анализа записи, почему бы не отказаться от XML и не использовать EDI или другой формат, основанный на записях?

Вы не используете XML для того, для чего он здесь полезен.Теги - это метаданные, которые описывают поток.Вы потеряли его, когда пошли на этот дизайн.

Я бы порекомендовал либо использовать XML лучше или перейти к схеме записи на основе позиции.

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