【问题标题】:There is another way to do this? XSLT nested for-each还有另一种方法可以做到这一点吗? XSLT 嵌套 for-each
【发布时间】:2018-03-23 03:41:34
【问题描述】:

我的问题是关于如何为 n 个日期和“fechas”(不允许使用另一个模板)执行此操作。我很难做到,我对“for-each”功能很陌生。谢谢!

输入 xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="transformer.xsl"?>
<dc>
   <date>11</date>
   <date>20</date>
   <status>Available</status>
   <status>Collected</status>
</dc>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="/dc/status">
    <date>
        <xsl:if test="position()=1">
            <xsl:attribute name="fechas">
                <xsl:value-of select="."/>
            </xsl:attribute>
        <xsl:for-each select="/dc/date">
            <xsl:if test="position()=1">
                <xsl:value-of select="."/>
            </xsl:if>
        </xsl:for-each>    
        </xsl:if>
        <xsl:if test="position()=2">
            <xsl:attribute name="fechas">
                <xsl:value-of select="."/>
            </xsl:attribute>
            <xsl:for-each select="/dc/date">
                <xsl:if test="position()=2">
                    <xsl:value-of select="."/>
                </xsl:if>
            </xsl:for-each>    
        </xsl:if>
    </date>
</xsl:for-each>

这是我的输出:

<?xml version="1.0" encoding="UTF-8"?>
 <date fechas="Available">11</date>
 <date fechas="Collected">20</date>

【问题讨论】:

    标签: xml xslt foreach


    【解决方案1】:

    你可以试试这个:

    <xsl:template match="/">
        <xsl:for-each select="dc/date">
            <xsl:variable name="pos" select="position()"/>
            <xsl:copy>
                <xsl:if test="../status[$pos]">
                    <xsl:attribute name="fechas">
                        <xsl:value-of select="../status[$pos]"/>
                    </xsl:attribute>
                </xsl:if>
                <xsl:apply-templates/>
            </xsl:copy>
        </xsl:for-each>
    </xsl:template>
    

    请参阅 http://xsltransform.net/pNvs5w4 的转换

    【讨论】:

    • 谢谢,我不知道“复制”功能。还有什么要学的。 :)
    【解决方案2】:

    这是怎么回事:

    <xsl:template match="/">
      <date fechas="{dc/status[1]}>
        <xsl:value-of select="dc/date[1]"/>
      </date>
      <date fechas="{dc/status[2]}>
        <xsl:value-of select="dc/date[2]"/>
      </date>
    </xsl:template>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-28
      • 2011-02-28
      • 2018-08-28
      • 2012-10-01
      • 1970-01-01
      • 2011-04-18
      • 2022-01-20
      • 1970-01-01
      相关资源
      最近更新 更多