如何使用XSLT 1.0在某些条件下限制for-each循环?

时间:2019-06-13 11:36:32

标签: xml xslt-1.0

我有这个XML代码,我希望我的for循环仅运行/显示特​​定类型num-10,20,180的值

<input>
<name>Jack</name>
<age>23</age>
<type-10-num>1</type-10-num>
<type-20-num>2</type-20-num>
<type-20-char>3</type-20-char>
<type-180-num>4</type-180-num>
<type-180-char>5</type-180-char>
<type-180-str>6</type-180-str>
</input>

我正在运行一个for-each循环来检查节点的类型-

<xsl:for-each select="exslt:node-set($input)/*[starts-with(name(),'type-')]">

然后从变量中获取类型值-

 <xsl:variable name="fetchValue">               
                        <xsl:value-of select="substring-before(substring-after(name(), '-'), '-')" />                   
                    </xsl:variable>

但是我希望我的for循环为每个值10、20、180运行一次。 如果类型20出现2次,我希望它每20次运行一次,然后转到下一个180。因此总计应该运行3次,或者说我想打印一些与这3个值相关的详细信息(因此应该不重复)。

2 个答案:

答案 0 :(得分:0)

您可以使用substring-after两次来检查结尾num

<xsl:for-each select="exslt:node-set($input)/*[starts-with(name(),'type-') and substring-after(substring-after(name(),'-'),'-') = 'num']">
  <xsl:value-of select="."/> </xsl:text>
</xsl:for-each>

输出为:

1 2 4

如果只想匹配这些确切名称,则可以直接选择它们:

<xsl:for-each select="exslt:node-set($input)/*[self::type-10-num or self::type-20-num or self::type-180-num]">
  <xsl:value-of select="."/><xsl:text> </xsl:text>
</xsl:for-each>

输出相同。

答案 1 :(得分:0)

此转换

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

  <xsl:template match=
        "*[starts-with(name(), 'type-')
         and substring(name(), string-length(name())-2) = 'num'
         ]">
    <xsl:copy-of select="."/>
  </xsl:template>

  <xsl:template match="text()"/>
</xsl:stylesheet>

应用于提供的XML文档(为便于阅读而设置):

<input>
    <name>Jack</name>
    <age>23</age>
    <type-10-num>1</type-10-num>
    <type-20-num>2</type-20-num>
    <type-20-char>3</type-20-char>
    <type-180-num>4</type-180-num>
    <type-180-char>5</type-180-char>
    <type-180-str>6</type-180-str>
</input>

为名称为每个元素的数据类型为XYZ-num的数据

<type-10-num>1</type-10-num>
<type-20-num>2</type-20-num>
<type-180-num>4</type-180-num>

一个人可以在匹配的模板中替换此代码:

<xsl:copy-of select="."/>

解决要解决的特定问题所需的一切。