Недопустимое значение, используемое для имени атрибута во время преобразования xslt в Java - PullRequest
0 голосов
/ 05 июня 2018

Привет. Я пытаюсь преобразовать XML в другой XML, используя xsl.Преобразование XSL работает нормально при тестировании в Oxygen Developer и VM.

Но все же я получаю предупреждение типа "Недопустимое значение, используемое для имени атрибута" в строках № 20 и 23.

XSL, который я использовал:

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:cl="http://tyryt.com/abc/abc_order"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:java="http://xml.apache.org/xslt/java"
        exclude-result-prefixes="cl xsd java" version="1.0">
        <xsl:output indent="yes" method="xml" encoding="UTF-8" omit-xml-declaration="no"/>

        <xsl:template name="generateInsightsHeader">
            <xsl:for-each select="/">
                <xsl:element name="pon">
                    <xsl:value-of select="*/cl:HDR/cl:PON"/>
                </xsl:element>
                <xsl:element name="version">
                    <xsl:value-of select="*/cl:HDR/cl:VER"/>
                </xsl:element>
            </xsl:for-each>
        </xsl:template>

        <xsl:template name="copyWholeXml" match="*">
            <xsl:if test="local-name() != 'brmserrorxml'">
                <xsl:element name="{local-name()}">
                    <xsl:for-each select="@*">
                        <xsl:if test="../@protocoltype != ''">
                            <xsl:attribute name="{local-name()}">
                                <xsl:value-of select="."/>
                            </xsl:attribute>
                        </xsl:if>
                    </xsl:for-each>
                    <xsl:apply-templates/>
                </xsl:element>
            </xsl:if>
        </xsl:template>

        <xsl:template match="/">
            <IntermediateXml xmlns:json="http://json.org/">
                <xsl:choose>
                    <xsl:when test="cl:SAMPLE_ORDER">
                        <xsl:call-template name="generateInsightsHeader"/>
                        <xsl:call-template name="copyWholeXml"/>
                    </xsl:when>
                </xsl:choose>
            </IntermediateXml>
        </xsl:template>
    </xsl:stylesheet>

и образец XML, который я использовал:

    <?xml version="1.0"?>
    <SAMPLE_ORDER class="1" index="0" xmlns="http://tyryt.com/abc/abc_order" service="SAMPLE_ORDER">
      <header>
        <interfaceid>INTERFACE_REQUIRED</interfaceid>
        <actionrequired>Transmit</actionrequired>
      </header>
      <HDR>
        <MESSAGE_ID>229364ASE</MESSAGE_ID>
        <DATE>2017-09-04T12:29:11+05:30</DATE>
        <PON>229364ASE10</PON>
        <VER>01</VER>
      </HDR>
      <LOCAL_MESSAGE>
        <LOCAL_ADMIN>
          <LOCQTY>111</LOCQTY>
          <AN>JHGKJ679868</AN>
          <CC>005F</CC>
          <AUTHORIZATION>
            <DDD>20171228</DDD>
            <ACTL>01234567899</ACTL>
          </AUTHORIZATION>
        </LOCAL_ADMIN>
        <LSR_BILL>
          <ACNA>WEE</ACNA>
        </LSR_BILL>
        <CONTACT>
          <INIT>ASDDFAD</INIT>
          <INIT_TEL_NO>2543654576</INIT_TEL_NO>
          <INIT_EMAIL>abc@gmail.com</INIT_EMAIL>
        </CONTACT>
      </LOCAL_MESSAGE>
      <LS>
        <LS_SVC_DET>
          <SVC_DET_GRP>
            <LOCNUM>145</LOCNUM>
            <LNUM>78945</LNUM>
            <LNA>D</LNA>
            <ECCKT>98698KJGKUJGUKJH</ECCKT>
          </SVC_DET_GRP>
        </LS_SVC_DET>
      </LS>
    </SAMPLE_ORDER>

Для трансформации я использую банку Xalan.

Пожалуйста, помогитемне решить эту проблему.Заранее спасибо

1 Ответ

0 голосов
/ 05 июня 2018

Корневой узел не имеет имени, или, точнее, именем корневого узла документа является пустая строка ''.Поэтому, когда вы называете свой шаблон «copyWholeXml» и текущий узел контекста является корневым узлом, local-name() оценивается как '', а <xsl:element name="{local-name()}"> недопустим, поскольку вы не можете сгенерировать новый элемент XML с пустой строкой в ​​качестве имени.Когда вы называете свой шаблон «copyWholeXml», убедитесь, что вы не вводите именованный шаблон с корнем документа в качестве узла контекста

...