0

通常、Weblogic12 サーバー上で XSLT プロセスを実行しています。私はこの問題に遭遇し続けました

net.sf.saxon.trans.DynamicError: An attribute node 
(id) cannot be created after the children of the containing element

移行前は、私たちのチームにはまったく問題はありませんでした...

理由はありますか?最近、BEA Weblogic3 から Oracle Enterprise Weblogic 12 にアップグレードしました。それともライブラリがありませんか?

これは私たちのチーム全体を悩ませています! ありがとう!

編集1:

<xsl:attribute name="id">エラーポイント<xsl:template name="makeErrorDiv">

<td>
            <xsl:copy-of select="@colspan | @align | @style | @valign | @class | @id | @name"/>
            <xsl:if test="@colspan = '1' and $columnWidth != '' and not(@suppressColWidth='true')"><xsl:attribute name="width"><xsl:value-of select="$columnWidth"/></xsl:attribute></xsl:if>
            <xsl:if test="@rowspan != '1'"><xsl:copy-of select="@rowspan"/></xsl:if>

            <xsl:if test="descendant::ErrMsg">
                <xsl:call-template name="makeErrorDiv"/>
            </xsl:if>
        </td>


<xsl:template name="makeErrorDiv">      
        <div style="display:none;">
            <xsl:choose>
                <xsl:when test="descendant::*[ParentId]">
                    <xsl:attribute name="id"><xsl:value-of select="descendant::ParentId[position() = 1]"/><![CDATA[$err]]></xsl:attribute>
                </xsl:when>         
                <xsl:when test="descendant::*[ErrMsg][Name]">
                    <xsl:attribute name="id"><xsl:value-of select="descendant::*[ErrMsg][position() = 1]/Name"/><![CDATA[$err]]></xsl:attribute>
                </xsl:when>
                <xsl:when test="not(descendant::*[ErrMsg])">
                    <xsl:variable name="name"><xsl:value-of select="descendant::*[Name][position() = 1]/Name"/></xsl:variable>
                    <xsl:variable name="parsed"><xsl:value-of select="substring-before($name, '!')"/></xsl:variable>
                    <xsl:attribute name="id"><!--error here! -->
                        <xsl:choose>
                            <xsl:when test="$parsed = ''"><xsl:value-of select="$name"/></xsl:when>
                            <xsl:otherwise><xsl:value-of select="$parsed"/></xsl:otherwise>
                        </xsl:choose>
                    <xsl:text><![CDATA[$err]]></xsl:text></xsl:attribute>   
                </xsl:when>
                <xsl:when test="descendant::*[ErrMsg][not(Name)]">
                    <xsl:variable name="name"><xsl:value-of select="descendant::*[Name][position() = 1]/Name"/></xsl:variable>
                    <xsl:variable name="parsed"><xsl:value-of select="substring-before($name, '!')"/></xsl:variable>
                    <xsl:attribute name="id">
                        <xsl:choose>
                            <xsl:when test="$parsed = ''"><xsl:value-of select="$name"/></xsl:when>
                            <xsl:otherwise><xsl:value-of select="$parsed"/></xsl:otherwise>
                        </xsl:choose>
                    <xsl:text><![CDATA[$err]]></xsl:text></xsl:attribute>                   
                </xsl:when>
            </xsl:choose>   
            <span style="color: #FF0000; font-family: Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; text-decoration: none;"><xsl:value-of select="descendant::ErrMsg[position() = 1]"/></span>
        </div>      
    </xsl:template>

XML サンプル...参考になるかどうかわかりません...XML ファイル全体が 1000 行以上あります

<DisclosureRowColor template="OneColumn" position="8" lastPosition="30" colCount="4" color1="#F2F8FE" color2="#ffffff">
                <Cell colspan="1">
                    <ListBox onchange="toggleAddressByAjax();">
                        <Name>APPLICATION_CUSTOMER.EMPLOYED_SINCE_MM!YLI</Name>
                        <Size>1</Size>
                        <Default rtexprvalue="true">mb.getValue("APPLICATION_CUSTOMER.EMPLOYED_SINCE_MM!YLI", "A")</Default>
                        <Map rtexprvalue="true">mb.getGenericLookup("V_YEAR")</Map>
                        <ReadOnly rtexprvalue="true">mb.isReadonly(2)</ReadOnly>
                    </ListBox>
                    <Label class="sTGBFBS">
                        <Caption> &amp;nbsp;&amp;nbsp;Jahre </Caption>
                    </Label>
                    <ListBox onchange="toggleAddressByAjax();">
                        <Name>APPLICATION_CUSTOMER.EMPLOYED_SINCE_MM!MLI</Name>
                        <Size>1</Size>
                        <Default rtexprvalue="true">mb.getValue("APPLICATION_CUSTOMER.EMPLOYED_SINCE_MM!MLI", "A")</Default>
                        <Map rtexprvalue="true">mb.getGenericLookup("V_MONTH")</Map>
                        <ReadOnly rtexprvalue="true">mb.isReadonly(2)</ReadOnly>
                    </ListBox>
                    <Label class="sTGBGBS">
                        <Caption> &amp;nbsp;&amp;nbsp;Monate </Caption>
                    </Label>
                    <ErrMsg/>
                </Cell>
            </DisclosureRowColor>
4

1 に答える 1

2

あなたの問題は、要素内のノードである可能性があると思います<xsl:text><xsl:attribute>

<xsl:text><![CDATA[$err]]></xsl:text></xsl:attribute>

と言うだけでいいと思います

<![CDATA[$err]]></xsl:attribute>

テキストノードではなく属性を作成しているためです。

更新: エラーを再現しようとしましたが、できませんでした。しかし、saxon が属性に空白を使用していることがわかりました。XSL 要素のいくつかの間の空白の一部を取り除くことを試してみてください。

<xsl:when test="not(descendant::*[ErrMsg])">
                <xsl:variable name="name"><xsl:value-of select="descendant::*[Name][position() = 1]/Name"/></xsl:variable>
                <xsl:variable name="parsed"><xsl:value-of select="substring-before($name, '!')"/></xsl:variable>
                <xsl:attribute name="id"><xsl:choose>
                        <xsl:when test="$parsed = ''"><xsl:value-of select="$name"/></xsl:when>
                        <xsl:otherwise><xsl:value-of select="$parsed"/></xsl:otherwise>
                    </xsl:choose><xsl:text><![CDATA[$err]]></xsl:text></xsl:attribute>   
            </xsl:when>

そして、これはあなたが見ている実際のエラーを解決するかもしれません:

  <div style="display:none;"><xsl:choose>

id 属性を追加する前に、「div」要素にテキストを追加する必要があると思います。

于 2012-09-06T17:12:47.287 に答える