如何使用XSLT从具有编号出现次数的非结构化XML中选择值

时间:2019-01-09 12:31:06

标签: xml xslt xslt-1.0

对于标签打印功能,我试图了解如何使用XSLT和value-of select从非结构化xml输出中检索值。

如果两个标签之间的“ occ”(出现)数相等,请参见下面的示例,其中标签I3和I4相关。

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可以执行这种选择操作吗?我的知识仅限于如何选择带有occ = 3的标记I3,例如:

<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 :(得分:0)

如果可以确保该对中的一个元素始终存在,则可以将该元素用于初始选择。然后使用 key 检索该对中的另一个成员(可能存在或可能不存在)。

在此示例中,我们假设<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>

了解attribute value templates