XML: 以最佳方式定义变量
XML: define variable in an optimal way
从相同的输入我对相同的元素有不同的 xpaths(除了 1 个元素,它几乎完全相同的路径,见下文)
我的逻辑取决于元素“类型学”(在我的代码中定义)
XSLT 1.0
<xsl:variable name="date">
<xsl:choose>
<xsl:when test="$typology='A' or $typology='B' ">
<xsl:value-of select="/Header/info/data/Body/basketAB/date"/>
</xsl:when>
<xsl:when test="$typology='C' or $typology='D' or $typology='E'">
<xsl:value-of select="/Header/info/data/Body/basketCDE/date"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'CheckPath'"/>
</xsl:otherwise>
</xsl:choose>
如何避免使用 choose +several paths 并从 1 条路径中获取“date”just。
解决定义日期为:
<xsl:variable name="date" select="//date"/>
我会避开后代轴并使用更明确的路径:
<xsl:variable name="date" select="/Header/info/data/Body/*/date"/>
这是假设输入不能同时包含 basketAB
和 basketCDE
元素(这一点从你的问题中不清楚,否则这和当前接受的答案都不起作用)。
如果上面的假设被证明是不正确的,你可以这样做:
<xsl:variable name="date" select="/Header/info/data/Body/*[contains(name(), $typology)]/date"/>
使用这个单一的 XPath 1.0 表达式:
concat(/Header/info/data/Body/basketAB
[contains('|A|B|', concat('|', $typology, '|'))]/date
| /Header/info/data/Body/basketCDE
[contains('|C|D|E|', concat('|', $typology, '|'))]/date,
substring('CheckPath',
1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
)
使用 XSLT 1.0 验证:
鉴于此来源 XML 文档:
<Header>
<info>
<data>
<Body>
<basketAB>
<date>date1</date>
</basketAB>
<basketCDE>
<date>date2</date>
</basketCDE>
</Body>
</data>
</info>
</Header>
此 XSLT 转换计算上述 XPath 表达式 并输出此计算结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="typology" select="'A'"/>
<xsl:template match="/">
<xsl:variable name="date" select=
"concat(/Header/info/data/Body/basketAB[contains('|A|B|', concat('|', $typology, '|'))]/date
| /Header/info/data/Body/basketCDE[contains('|C|D|E|', concat('|', $typology, '|'))]/date,
substring('CheckPath', 1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
)"/>
<xsl:value-of select="$date"/>
</xsl:template>
</xsl:stylesheet>
运行多次变换,每次为变量指定不同的值$typology
:
所有情况下都能得到想要的结果:
'A' --> date1
'B' --> date1
'C' --> date2
'D' --> date2
'E' --> date2
'X' --> 检查路径
从相同的输入我对相同的元素有不同的 xpaths(除了 1 个元素,它几乎完全相同的路径,见下文)
我的逻辑取决于元素“类型学”(在我的代码中定义)
XSLT 1.0
<xsl:variable name="date">
<xsl:choose>
<xsl:when test="$typology='A' or $typology='B' ">
<xsl:value-of select="/Header/info/data/Body/basketAB/date"/>
</xsl:when>
<xsl:when test="$typology='C' or $typology='D' or $typology='E'">
<xsl:value-of select="/Header/info/data/Body/basketCDE/date"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'CheckPath'"/>
</xsl:otherwise>
</xsl:choose>
如何避免使用 choose +several paths 并从 1 条路径中获取“date”just。
解决定义日期为:
<xsl:variable name="date" select="//date"/>
我会避开后代轴并使用更明确的路径:
<xsl:variable name="date" select="/Header/info/data/Body/*/date"/>
这是假设输入不能同时包含 basketAB
和 basketCDE
元素(这一点从你的问题中不清楚,否则这和当前接受的答案都不起作用)。
如果上面的假设被证明是不正确的,你可以这样做:
<xsl:variable name="date" select="/Header/info/data/Body/*[contains(name(), $typology)]/date"/>
使用这个单一的 XPath 1.0 表达式:
concat(/Header/info/data/Body/basketAB
[contains('|A|B|', concat('|', $typology, '|'))]/date
| /Header/info/data/Body/basketCDE
[contains('|C|D|E|', concat('|', $typology, '|'))]/date,
substring('CheckPath',
1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
)
使用 XSLT 1.0 验证:
鉴于此来源 XML 文档:
<Header>
<info>
<data>
<Body>
<basketAB>
<date>date1</date>
</basketAB>
<basketCDE>
<date>date2</date>
</basketCDE>
</Body>
</data>
</info>
</Header>
此 XSLT 转换计算上述 XPath 表达式 并输出此计算结果:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:variable name="typology" select="'A'"/>
<xsl:template match="/">
<xsl:variable name="date" select=
"concat(/Header/info/data/Body/basketAB[contains('|A|B|', concat('|', $typology, '|'))]/date
| /Header/info/data/Body/basketCDE[contains('|C|D|E|', concat('|', $typology, '|'))]/date,
substring('CheckPath', 1 div not(contains('|A|B|C|D|E|', concat('|', $typology, '|'))))
)"/>
<xsl:value-of select="$date"/>
</xsl:template>
</xsl:stylesheet>
运行多次变换,每次为变量指定不同的值$typology
:
所有情况下都能得到想要的结果:
'A' --> date1
'B' --> date1
'C' --> date2
'D' --> date2
'E' --> date2
'X' --> 检查路径