我是XSL / XML的新手,我查找了一些与标题相似的答案,但无法解决问题。我使用软件读取PDF文件并生成包含所需数据的XML。然后,我使用XSL构造XML以适合另一种系统的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>
我的问题是我想检查select
中的3个参数对我不起作用,我尝试使用|
也不起作用,带有|
的代码如下
<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>
输出,
<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也想跳过-
的值,但是输出不是我想要的,它不会跳过不需要的一次。 / p>
然后,我阅读了更多内容,发现使用not()
比使用!=
更好,因此我更改了<xsl:for-each select="Fields/Field[@Label != 'Heat (M)'] | Fields/Field[@Label != 'Ort'] | Fields/Field[@Value != '-']">
到
<xsl:for-each select="not(Fields/Field[@Label = 'Heat (M)'] | Fields/Field[@Label = 'Ort'] | Fields/Field[@Value = '-'])">
给了我一个Unexpected 'atomic' item
错误。
我希望我的问题很清楚,并且真的希望有人可以帮助我解决这个问题。