使用Param和@attribute显示条件XML

时间:2017-01-15 11:53:23

标签: xml xslt

我有一个XML文档,可能包含也可能不包含 Acceptable values are: 0 : no polygons 1 : pastel 2 : blue to yellow 3 : white to red 4 : light grey to red 5 : primary colors 6 : sequential single hue red 7 : sequential single hue lighter red 8 : light grey 节点。包含有错误和错误通知的任何字段名称

所以这个例子就是:

<errors>

我有一个FieldError模板:

<errors>
    <first_name>Not allowed to be BigBoy</first_name>
    <email>Required</email>
</errors>

在我的XSL文件中,我试图在字段名称旁边显示错误通知...所以在每个表单字段之后我调用FieldError模板:

在first_name字段之后:

<xsl:template name="FieldError" mode="user">
    <xsl:param name="attribute" />
    <xsl:if test="errors[@attribute=$attribute]">
        <span class="form-error"><xsl:value-of select="errors[@attribute=$attribute]" /></span>
    </xsl:if>
</xsl:template>

在电子邮件字段之后:

<xsl:call-template name="FieldError" mode="planner_user">
<xsl:with-param name="attribute">first_name</xsl:with-param></xsl:call-template>

我确定我之前有过这个工作,但是这次我不知道我到底做错了什么

1 个答案:

答案 0 :(得分:0)

考虑以下示例:

<强> XML

<root>
    <errors>
        <first_name>Not allowed to be BigBoy</first_name>
        <email>Required</email>
    </errors>
    <data>
        <first_name>BigBoy</first_name>
        <last_name>Smith</last_name>
        <email></email>
    </data>
</root>

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="err" match="errors/*" use="name()" />

<xsl:template match="/root">
    <output>
        <xsl:apply-templates select="data"/>
    </output>
</xsl:template>

<xsl:template match="data/*">
    <xsl:copy>
        <value>
            <xsl:value-of select="."/>
        </value>
        <xsl:apply-templates select="key('err', name())"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="errors/*">
    <error>
        <xsl:value-of select="."/>
    </error>
</xsl:template>

</xsl:stylesheet>

<强>结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
   <first_name>
      <value>BigBoy</value>
      <error>Not allowed to be BigBoy</error>
   </first_name>
   <last_name>
      <value>Smith</value>
   </last_name>
   <email>
      <value/>
      <error>Required</error>
   </email>
</output>