XSL - проверка более одного аргумента с помощью выбора - PullRequest
0 голосов
/ 10 июля 2019

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

Мой XML (часть, которая имеет значение для этого вопроса)

    <LineItemRow ID="6" FromPage="2">
          <Fields>
            <Field ID="123a66a4876d4f53bf87ac95dd623c67" Type="Text" Status="Complete" Label="Heat (M)">
              <Value>40331</Value>
              <OcrExtractedValue T="40331 HEB100 FL L P 410 529 29" X="224" Y="997" H="15" W="850" L="27" C="100">
                <Keyword T="40331 " X="224" Y="997" H="15" W="70" L="27" C="100" />
              </OcrExtractedValue>
            </Field>
            <Field ID="8ff4d8bbde2b45039766a58952a040ae" Type="Text" Status="Complete" Label="Ort">
              <Value>FL</Value>
              <OcrExtractedValue T="40331 HEB100 FL L P 410 529 29" X="224" Y="997" H="15" W="850" L="27" C="100">
                <Keyword T="FL " X="636" Y="998" H="14" W="27" L="27" C="100" />
              </OcrExtractedValue>
            </Field>
            <Field ID="1fd972224fd64c3aad82812a3a951ced" Type="Text" Status="Complete" Label="Tensile - ReH">
              <Value>410</Value>
              <OcrExtractedValue T="40331 HEB100 FL L P 410 529 29" X="224" Y="997" H="15" W="850" L="27" C="100">
                <Keyword T="410 529 29 " X="824" Y="997" H="15" W="105" L="27" C="100" />
              </OcrExtractedValue>
            </Field>
            <Field ID="485dc23c9f35440e8d4683012b0d6b14" Type="Text" Status="Complete" Label="Tensile - Rm">
              <Value>529</Value>
            </Field>
            <Field ID="35c9bfa296e747d3b1249cd1a4804483" Type="Text" Status="Complete" Label="Tensile - A5">
              <Value>29</Value>
            </Field>
            <Field ID="23ffc002c972482284eb9c748e02dfe0" Type="Text" Status="Complete" Label="Impact - Temp">
              <Value>-</Value>
            </Field>
            <Field ID="bc4ab2575d0548c18fd0bd7ff41d0839" Type="Text" Status="Complete" Label="Impact - 1">
              <Value>-</Value>
            </Field>
            <Field ID="8219c9f6f2f248f6872f49497a3b5c1f" Type="Text" Status="Complete" Label="Impact - 2">
              <Value>-</Value>
            </Field>
            <Field ID="f6124a3e10c347fda48f8d39f7ee55cf" Type="Text" Status="Complete" Label="Impact - 3">
              <Value>-</Value>
            </Field>
            <Field ID="4a3493709a674350b22ec4bb2699a8b1" Type="Text" Status="Complete" Label="Impact - MW">
              <Value>-</Value>
            </Field>
          </Fields>
        </LineItemRow>

Моя проблема в том, что я хочу проверить 3 аргумента в select, который не работает для меня. Я попытался использовать |, который также не работал, код с | приведен ниже.

<xsl:for-each select="$container/BaseTypeObject/Metadata/LineItemRows/LineItemRow[Fields/Field[@Label = 'Heat (M)']]">
                <TestDataSet Type="3">
                    <xsl:attribute name="HeatID" select="Fields/Field[@Label = 'Heat (M)']/Value"/>
                    <xsl:for-each select="Fields/Field[@Label != 'Heat (M)'] | Fields/Field[@Label != 'Ort'] | Fields/Field[@Value != '-']">
                        <TestDataValue>
                            <xsl:attribute name="Qualifier" select="@Label"/>
                            <xsl:choose>
                                <xsl:when test="@Label = 'Tensile - Re'">
                                    <xsl:attribute name="Unit" select="'N/mm²'"/>
                                </xsl:when>
                                <xsl:when test="@Label = 'Tensile - Rm'">
                                    <xsl:attribute name="Unit" select="'N/mm²'"/>
                                </xsl:when>
                                <xsl:when test="@Label = 'Tensile - A5.65'">
                                    <xsl:attribute name="Unit" select="'%'"/>
                                </xsl:when>                             
                                <xsl:when test="@Label = 'Impact - Value 1'">
                                    <xsl:attribute name="Unit" select="'°C'"/>
                                </xsl:when>
                                <xsl:when test="@Label = 'Impact - Value 2'">
                                    <xsl:attribute name="Unit" select="'J'"/>
                                </xsl:when>
                                <xsl:when test="@Label = 'Impact - Value 3'">
                                    <xsl:attribute name="Unit" select="'J'"/>
                                </xsl:when>
                                <xsl:when test="@Label = 'Impact - Temp'">
                                    <xsl:attribute name="Unit" select="'°C'"/>
                                </xsl:when>
                            </xsl:choose>
                            <xsl:attribute name="PageNo">
                                <xsl:call-template name="GetPageNo">
                                    <xsl:with-param name="container" select="$container"/>
                                    <xsl:with-param name="lineitemrow" select="../.."/>
                                </xsl:call-template>
                            </xsl:attribute>
                            <!--<xsl:choose>
                                <xsl:when test="@Label = 'Hardness' and contains(Value,'-')">
                                    <xsl:variable name="min" select="number(substring-before(Value,'-'))"/>
                                    <xsl:variable name="max" select="number(substring-after(Value,'-'))"/>
                                    <xsl:value-of select="xs:decimal($min + (($max - $min) div 2))"/>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="xs:decimal(translate(Value,',','.'))"/>
                                </xsl:otherwise>
                            </xsl:choose>-->
                        </TestDataValue>
                    </xsl:for-each>

Out put,

        <TestDataSet Type="3" HeatID="40331">
            <TestDataValue Qualifier="Heat (M)" PageNo="2"/>
            <TestDataValue Qualifier="Ort" PageNo="2"/>
            <TestDataValue Qualifier="Tensile - ReH" PageNo="2"/>
            <TestDataValue Qualifier="Tensile - Rm" Unit="N/mm²" PageNo="2"/>
            <TestDataValue Qualifier="Tensile - A5" PageNo="2"/>
            <TestDataValue Qualifier="Impact - Temp" Unit="°C" PageNo="2"/>
            <TestDataValue Qualifier="Impact - 1" PageNo="2"/>
            <TestDataValue Qualifier="Impact - 2" PageNo="2"/>
            <TestDataValue Qualifier="Impact - 3" PageNo="2"/>
            <TestDataValue Qualifier="Impact - MW" PageNo="2"/>
        </TestDataSet>

Как вы можете видеть, я хотел пропустить метки Heat (M), а Ort также хотел пропустить значения, которые -, но out не был тем, что яхотел, он не пропускает нежелательные один раз.

Затем я прочитал немного больше, чтобы найти, что лучше использовать not(), чем !=, поэтому я изменил, <xsl:for-each select="Fields/Field[@Label != 'Heat (M)'] | Fields/Field[@Label != 'Ort'] | Fields/Field[@Value != '-']">

to

<xsl:for-each select="not(Fields/Field[@Label = 'Heat (M)'] | Fields/Field[@Label = 'Ort'] | Fields/Field[@Value = '-'])">, что дало мне ошибку Unexpected 'atomic' item.

Я надеюсь, что мой вопрос достаточно ясен, и очень надеюсь, что кто-то может помочь мне решить эту проблему.

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