xml - 如何使用 XSLT 从出现编号的非结构化 XML 中选择值
问题描述
对于标签打印功能,我试图了解如何使用 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>
解决方案
如果您可以确定该对中的一个元素将始终存在,则可以使用该元素进行初始选择。然后使用密钥检索该对的另一个成员(可能存在也可能不存在)。
在此示例中,我们假设<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>
阅读属性值模板。
推荐阅读
- imagemagick - 可以在 AWS Linux 2 中添加对 PHP 的 imagick webp 支持吗?
- php - 从 2 个数据透视表返回数据
- python - Python获取字符串的位置和接下来的X行
- javascript - Javascript 和 React:如何调用或引用函数?
- python-3.x - 我无法让这段代码工作,谁能告诉我我做错了什么?subl 说第 18 行有一个错误,但真的无法弄清楚
- python - python中的逻辑回归-初学者-重塑数据集
- vim - vim 中那些奇怪的标签“<++>”有什么用?
- facebook - 如何使用Oauth2连接和使用facebook营销api
- android - RecyclerView 不会向下滚动
- random - 使用 map reduce 进行采样