使用for-each和param的xslt打印问题

时间:2015-04-24 17:54:03

标签: xml xslt xpath

我正在尝试将这段xml格式化为所需的输出。

输入xml:

<Damage>
    <MachineryItems>
        <MachineryItemDisplayBean>
            <itemNumber>1</itemNumber>
            <additionalCoverBasis>MD</additionalCoverBasis>
        </MachineryItemDisplayBean>
        <MachineryItemDisplayBean>
            <itemNumber>2</itemNumber>
            <additionalCoverBasis>MP</additionalCoverBasis>
        </MachineryItemDisplayBean>
        <MachineryItemDisplayBean>
            <itemNumber>3</itemNumber>
            <additionalCoverBasis>MC</additionalCoverBasis>
        </MachineryItemDisplayBean>
    </MachineryItems>
</Damage>

这是需要进行格式化的xml: <MachineryItemDisplayBean>下有多个<MachineryItems>

如果<MachineryItemDisplayBean>中的任何一个具有<additionalcoverbasis>下的值MP,那么如果<MachineryItemDisplayBean>中没有<additionalcoverbasis>具有Y 下的值MP,那么Y需要打印打印

上一个输入xml的输出应为:

<xsl:template match="Damage/MachineryItems">
    <xsl:param name="DMFlag" select="'N'">
    <xsl:for-each select="MachineryItemDisplayBean">
        <xsl:if test="MachineryItemDisplayBean/additionalCoverBasis = 'MP'">
             <xsl:value-of select="'Y'"/>
        </xsl:if>
    </xsl:for-each>
    <xsl:value-of select="$DMFlag"/>
    </xsl:param>
</xsl:template>

使用XSL:

if ($result->num_rows > 0) {
     $myTable = "<table><tr><th>ID</th><th>Name</th></tr>";
     // output data of each row
     while($row = $result->fetch_assoc()) {
         $myTable .= "<tr><td>" . $row["id"]. "</td><td>" . $row["firstname"]. " " . $row["lastname"]. "</td></tr>";
     }
     $myTable .= "</table>";
} else {
     echo "0 results";
}

有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

  

如果<MachineryItemDisplayBean>中的任何一个具有值MP   在<additionalcoverbasis>下,如果没有,则需要在其他地方打印   <MachineryItemDisplayBean>具有值MP   在<additionalcoverbasis>下,需要打印N

我相信转换为:

<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="Damage/MachineryItems/MachineryItemDisplayBean/additionalCoverBasis[.='MP']">Y</xsl:when>
        <xsl:otherwise>N</xsl:otherwise>
    </xsl:choose>
</xsl:template>

答案 1 :(得分:0)

样式表有什么问题:

  • 从未使用过值的xsl:paramxsl:variable无效(XSLT库甚至可以避免对其进行评估)
  • 如果您为每个Y元素创建NMachineryItemDisplayBean,最后您将获得NYN
  • 之类的内容

实现您需要的几种方法:

解决方案1:两个模板,只有一个匹配

<xsl:template match="Damage[MachineryItems/MachineryItemDisplayBean/additionalCoverBasis = 'MP']">
    Y
</xsl:template>

<xsl:template match="Damage[not(MachineryItems/MachineryItemDisplayBean/additionalCoverBasis = 'MP')]">
    N
</xsl:template>

解决方案2:单个模板

<xsl:template match="Damage">
    <xsl:choose>
        <xsl:when test="MachineryItems/MachineryItemDisplayBean/additionalCoverBasis = 'MP'">
            Y
        </xsl:when>
        <xsl:otherwise>
            N
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>