«расширить» XML в Java - PullRequest
       1

«расширить» XML в Java

1 голос
/ 04 января 2012

У меня есть XML-файл с тысячами строк с элементами, которые отличаются только некоторой подстрокой, которая появляется в различных атрибутах и ​​содержимом элемента.

Так что я хотел бы «сжать» XML и получитьтаблица стилей создает xml на лету, заменяя известные подстроки во время выполнения известными подстановками.Подход с использованием таблиц стилей может показаться элегантным решением этой проблемы, учитывая то, что я о них читал, но если он работает, я действительно не возражаю против того, как я получу решение.

Этот принципал должен бытьуниверсальный, т. е. применяется к элементам xml с дочерними узлами глубиной n уровней, например,

«сжатый» xml может выглядеть как

<element id="11[substitute here]11">
    <name>[substitute here]</name>
        <settings>
            <setting>
                <name>[substitute here]Setting</name>
                <!-- could be more elements here, n levels deep -->
            </setting>
        </settings>
    <moreConfig>zz[substitute here]zz</moreConfig>
</element>

расширенный xml, заменяя «[заменить здесь]» на «aaa', а затем' bbb ', тогда выглядело бы как

<element id="11aaa11">
    <name>aaa</name>
        <settings>
            <setting>
                <name>aaaSetting</name>
                <!-- could more elements here, n levels deep -->
            </setting>
        </settings>
    <moreConfig>zzaaazz</moreConfig>
</element>  

    <element id="11bbb11">
        <name>bbb</name>
            <settings>
                <setting>
                    <name>bbbSetting</name>
                    <!-- could more elements here, n levels deep -->
                </setting>
            </settings>
        <calendar>zzbbbzz</calendar>
    </element>

Я делаю это в Java 6, так что я понимаю, если поддерживается использование только xsl 1.0.

Надеюсь, я'Мы ясно изложили проблему, благодарны за любую помощь!

большое спасибо

1 Ответ

1 голос
/ 04 января 2012

Это преобразование:

<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:my="my:my">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>

     <my:reps>
      <r>aaa</r>
      <r>bbb</r>
     </my:reps>

     <xsl:variable name="vReps"
          select="document('')/*/my:reps/r"/>

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

     <xsl:template match="config">
      <xsl:param name="pCurrentRep"/>

      <xsl:variable name="vDoc" select="."/>
      <xsl:copy>
       <xsl:for-each select="$vReps">
        <xsl:apply-templates select="$vDoc/*">
         <xsl:with-param name="pCurrentRep" select="."/>
        </xsl:apply-templates>
       </xsl:for-each>
      </xsl:copy>
     </xsl:template>

     <xsl:template match="@*[contains(., '[substitute here]')]"
      priority="2">
      <xsl:param name="pCurrentRep"/>

      <xsl:attribute name="{name()}">
       <xsl:call-template name="replace">
        <xsl:with-param name="pRep" select="$pCurrentRep"/>
       </xsl:call-template>
      </xsl:attribute>
     </xsl:template>

     <xsl:template match="text()[contains(., '[substitute here]')]"
     priority="2">
      <xsl:param name="pCurrentRep"/>

       <xsl:call-template name="replace">
        <xsl:with-param name="pRep" select="$pCurrentRep"/>
       </xsl:call-template>
     </xsl:template>

     <xsl:template name="replace">
      <xsl:param name="pText" select="."/>
      <xsl:param name="pTarget" select="'[substitute here]'"/>
      <xsl:param name="pRep"/>

      <xsl:if test="string-length($pText) >0">
        <xsl:choose>
          <xsl:when test="not(contains($pText, $pTarget))">
            <xsl:value-of select="$pText"/>
          </xsl:when>
          <xsl:otherwise>
            <xsl:value-of select="substring-before($pText, $pTarget)"/>
            <xsl:value-of select="$pRep"/>

            <xsl:call-template name="replace">
              <xsl:with-param name="pText" select=
                 "substring-after($pText, $pTarget)"/>
              <xsl:with-param name="pTarget" select="$pTarget"/>
              <xsl:with-param name="pRep" select="$pRep"/>
            </xsl:call-template>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
     </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<config>
    <element id="11[substitute here]11">
        <name>[substitute here]</name>
        <settings>
            <setting>
                <name>[substitute here]Setting</name>
                <!-- could be more elements here, n levels deep -->
            </setting>
        </settings>
        <moreConfig>zz[substitute here]zz</moreConfig>
    </element>
</config>

дает желаемый, правильный результат :

<config>
   <element id="11aaa11">
      <name>aaa</name>
      <settings>
         <setting>
            <name>aaaSetting</name><!-- could be more elements here, n levels deep -->
         </setting>
      </settings>
      <moreConfig>zzaaazz</moreConfig>
   </element>
   <element id="11bbb11">
      <name>bbb</name>
      <settings>
         <setting>
            <name>bbbSetting</name><!-- could be more elements here, n levels deep -->
         </setting>
      </settings>
      <moreConfig>zzbbbzz</moreConfig>
   </element>
</config>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...