XSLT генерирует нежелательное пространство имен - PullRequest
0 голосов
/ 03 мая 2018

У меня есть xml как это:

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:jaxws="http://cxf.apache.org/blueprint/jaxws"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd           http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/schemas/blueprint/jaxws.xsd           http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd          http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0 http://aries.apache.org/schemas/blueprint-cm/blueprint-cm-1.1.0.xsd">
<cm:property-placeholder persistent-id="pot_kodtar_service" update-strategy="reload"/>
...
<bean class="xxxxx.fuse.util.CommonAuthInterceptor" id="authorizationInterceptor">
    <property name="methodRolesMap">
        <map>
            <entry key="xxxElemE1" value="xxxElemE1Role"/>
            <entry key="xxxTipusE1" value="xxxTipusE1Role"/>
            <entry key="xxxLekerdezE1" value="xxxLekerdezE1Role"/>
            <entry key="xxxValtozasE1" value="xxxValtozasE1Role"/>
        </map>
    </property>
    <property name="globalRoles" value="xxxUsers"/>
</bean>

И я хочу добавить новый элемент после последней записи. Если я нашел последний элемент без пространства имен, как это:

    <xsl:template match="*:map/*:entry[last()]">     
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>       
        <entry key="{$service-name}" value="{$service-name}Role"/>
    </xsl:copy>
</xsl:template>

Я получаю дополнительные имена в выходном документе, например:

               <entry key="xxxValtozasE1" value="xxxValtozasE1Role"/> <!-- that is last existing element-->
        <entry xmlns=""
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               key="xxxElemKeresE1"
               value="xxxElemKeresE1Role"/> <!-- that is newly added element with unwanted namespaces-->

Вставленная запись содержит дополнительные определения xmlns: = "" и xmlns: xsd = "...". Как я могу устранить эти дополнительные определения пространства имен?

ТНХ Zamek

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Общее правило с XSLT и пространствами имен: убедитесь, что вы генерируете свои элементы с правильным расширенным именем, а объявления пространства имен позаботятся о себе.

Вы хотите создать элемент с расширенным именем ("http://www.osgi.org/xmlns/blueprint/v1.0.0"," entry "), но вы фактически сгенерировали элемент с расширенным именем (" "," entry ").

Изменить буквенный элемент результата на

<entry key="{$service-name}" value="{$service-name}Role" xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"/> 

поэтому элемент теперь имеет правильное расширенное имя, и необъявленное объявление пространства имен исчезнет.

0 голосов
/ 03 мая 2018

Кажется, что exclude-result-prefixes = "xsd" в корне xslt подходит для одного из элементов, который находится глубоко внутри xml, например: / bean / property / map / entry. К сожалению, у меня есть другой элемент в корневом каталоге с именем route:

        <route id="xxxModositE1_Route" streamCache="true">
        <from id="xxxModositE1_from1" uri="cxf:bean:xxxModositE1_LocalEndpoint?dataFormat=PAYLOAD"/>
        <convertBodyTo
            id="xxxModositE1_convertBodyTo1" type="java.lang.String"/>
        <wireTap id="xxxModositE1_wireTap1" uri="direct-vm:logRequest"/>
        <to id="xxxModositE1_to2" uri="cxf:bean:xxxModositE1_RemoteEndpoint?dataFormat=PAYLOAD"/>
        <convertBodyTo
            id="xxxModositE1_convertBodyTo3" type="java.lang.String"/>
        <wireTap id="xxxModositE1_wireTap3" uri="direct-vm:logResponse"/>
    </route>

Я пытаюсь сопоставить его с:

 <xsl:template match="*:route[last()]">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>       
    </xsl:copy>
    <xsl:comment><xsl:value-of select='$service-name'/></xsl:comment>
    <route id="{$service-name}_xslt_Route" streamCache="true" xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
        <from id="{$service-name}_from1" uri="cxf:bean:{$service-name}_LocalEndpoint?dataFormat=PAYLOAD"/>
        <convertBodyTo id="{$service-name}_convertBodyTo1" type="java.lang.String"/>
        <wireTap id="{$service-name}_wireTap1" uri="direct-vm:logRequest"/>
        <to id="{$service-name}_to2" uri="cxf:bean:{$service-name}_RemoteEndpoint?dataFormat=PAYLOAD"/>
        <convertBodyTo id="{$service-name}_convertBodyTo3" type="java.lang.String"/>
        <wireTap id="{$service-name}_wireTap3" uri="direct-vm:logResponse"/>
    </route>
    <!--  -->
</xsl:template>

и результат будет:

 <route xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
         id="TorzsHorizontKomplexKodtarElemKeresE1_xslt_Route"
         streamCache="true">
...

Конечно, я не хочу дополнительных xmlns в этом элементе. Актуальна ли позиция? Вот корень моего xslt:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" 
exclude-result-prefixes="xsd">

ТНХ Zamek

0 голосов
/ 03 мая 2018

Добавьте xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" и exclude-result-prefixes="xsd" в корневой элемент xsl:stylesheet или xsl:transform вашей таблицы стилей. Первое предложение должно поместить элементы результата в выходное пространство имен, а второе должно избегать вывода xmlns:xsd, который, как я полагаю, вы объявили в таблице стилей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...