gpt4 book ai didi

xml - 命名空间停止 XSLT 工作

转载 作者:数据小太阳 更新时间:2023-10-29 02:58:27 26 4
gpt4 key购买 nike

我有一个看起来像这样的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
<xsl:param name="month"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="month">
<xsl:param name="month"/>
<month>
<xsl:choose>
<xsl:when test="$month">
<xsl:value-of select="$month"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</month>
</xsl:template>

<xsl:template name="splitMonths">
<xsl:param name="months"/>
<xsl:variable name="firstMonth" select="substring-before($months,',')"/>
<xsl:variable name="month">
<xsl:choose>
<xsl:when test="$firstMonth">
<xsl:value-of select="$firstMonth"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$months"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="otherMonths" select="substring-after($months,',')"/>
<xsl:if test="$month">
<xsl:apply-templates>
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$otherMonths">
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="$otherMonths"/>
</xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template match="payload">
<payload>
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="sets/month"/>
</xsl:call-template>
</payload>
</xsl:template>

</xsl:stylesheet>

这是输入:

<?xml version="1.0" encoding="UTF8"?>
<Response xmlns="http://www.castiron.com/response">
<code>0</code>
<message>Success</message>
<payload>
<sets>
<month>AUG,SEP,OCT,NOV,DEC,JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC,JAN</month>
<season>Season11</season>
<productId>11111</productId>
</sets>
</payload>
</Response>

由于 <Response xmlns="http://www.castiron.com/response"> 中的 namespace 标记这会导致整个 XSLT 失败。是否可以取消 namespace 以便 XSLT 工作。如果您删除命名空间并运行 XSLT,它将完美运行!

最佳答案

在 XSLT 中定义命名空间,iep>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:r="http://www.castiron.com/response" exclude-result-prefixes="r">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="@* | node()">
<xsl:param name="month"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>

<xsl:template match="r:month">
<xsl:param name="month"/>
<month xmlns="http://www.castiron.com/response">
<xsl:choose>
<xsl:when test="$month">
<xsl:value-of select="$month"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</month>
</xsl:template>

<xsl:template name="splitMonths">
<xsl:param name="months"/>
<xsl:variable name="firstMonth" select="substring-before($months,',')"/>
<xsl:variable name="month">
<xsl:choose>
<xsl:when test="$firstMonth">
<xsl:value-of select="$firstMonth"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$months"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="otherMonths" select="substring-after($months,',')"/>
<xsl:if test="$month">
<xsl:apply-templates>
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</xsl:if>
<xsl:if test="$otherMonths">
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="$otherMonths"/>
</xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template match="r:payload">
<payload xmlns="http://www.castiron.com/response">
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="r:sets/r:month"/>
</xsl:call-template>
</payload>
</xsl:template>

</xsl:stylesheet>

关于xml - 命名空间停止 XSLT 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9886520/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com