【问题标题】:Rename node name with "P" and add attribute as and old name用“P”重命名节点名称并将属性添加为旧名称
【发布时间】:2019-01-17 16:22:07
【问题描述】:

我正在尝试将 xml 转换为 groovy 中 google translate api 的 HTML 标签。由于谷歌翻译非 html 标签,我想将 xml 标签作为属性名称和标签名称作为“p”移动。我已经从我拥有的数据中生成了以下 XML。

<root>
   <glossary>
      <GlossDiv>
         <GlossList>
                  <element>
                  <GlossEntry>
                     <Abbrev>ISO 8879:1986</Abbrev>
                     <GlossDef>
                        <GlossSeeAlso>
                           <element>
                              <element>GML</element>
                              <element>XML</element>
                           </element>
                        </GlossSeeAlso>
                        <para>A meta-markup language, used to create markup languages such as DocBook.</para>
                     </GlossDef>
                     <GlossSee>markup</GlossSee>
                     <GlossTerm>Standard Generalized Markup Language</GlossTerm>
                  </GlossEntry>
               </element>
               </GlossList>
      </GlossDiv>
   </glossary>

但我想要输出如下-

<p id="root">
   <p id="glossary">
      <p id="GlossDiv">
         <p id="GlossList">
                  <p id="element">
                  <p id="GlossEntry">
                     <p id="Abbrev">ISO 8879:1986</p>
                     <p id="GlossDef">
                        <p id="GlossSeeAlso">
                           <p id="element">
                              <p id="element">GML</p>
                              <p id="element">XML</p>
                           </p>
                        </p>
                        <p id="para">A meta-markup language, used to create markup languages such as DocBook.</p>
                     </p>
                     <p id="GlossSee">markup</p>
                     <p id="GlossTerm">Standard Generalized Markup Language</p>
                  </p>
               </p>
               </p>
      </p>
   </p>

一旦我从 google API 获得翻译后的内容,我想将其转换回原始 XML 格式。我已经尝试了各种 groovy 和 java 代码,但我无法按预期解析 XML。

谁能帮忙?

【问题讨论】:

  • 我可能只使用正则表达式:def newXml = oldXml.replaceAll(/&lt;(\w+)&gt;/, ) { all, group -&gt; "&lt;p id='$group'&gt;" }.replaceAll(/&lt;\/(\w+)&gt;/, ) { all, group -&gt; "&lt;/p&gt;" }
  • 它就像魅力一样。你能帮我做反向映射吗?我不擅长正则表达式。
  • 你说的反向映射是什么意思,如果你是指正则表达式的意思,只要检查一下regex101.com你就会得到它的详细解释:regex101.com/r/8hIZ5D/1
  • 我希望在获得翻译后的文本内容后将生成的输出转换回原始格式。即 格式。
  • 返回的方式更复杂,你可以使用它,但这更像是一个黑客而不是漂亮def lastTag def oldXml = newXml.replaceAll(/p(?: id=")?(?&lt;tag&gt;\w+)?"?&gt;/, { all, group -&gt; lastTag = (group) ? group : lastTag return "${lastTag}&gt;" })

标签: java xml grails groovy google-translation-api


【解决方案1】:

您可以为此使用 XSLT(可扩展样式表语言转换)。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method='xml' indent='yes'/>

    <xsl:template match="/">
        <xsl:for-each select="*">
            <xsl:call-template name="p_template"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="p_template">
        <p>
            <xsl:attribute name="id">
                <xsl:value-of select="name(.)"/>
            </xsl:attribute>
            <xsl:for-each select="text()">
                <xsl:value-of select="normalize-space(.)"/>
            </xsl:for-each>
            <xsl:call-template name="repeat"/>
        </p>
    </xsl:template>

    <xsl:template name="repeat">
        <xsl:for-each select="./*">
            <xsl:call-template name="p_template"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

你可以反向使用它:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method='xml' indent='yes'/>

    <xsl:template match="/">
        <xsl:for-each select="*">
            <xsl:call-template name="reverse_template"/>
        </xsl:for-each>
    </xsl:template>

    <xsl:template name="reverse_template">
        <xsl:element name="{@id}">
            <xsl:value-of select="text()"/>
            <xsl:call-template name="repeat"/>
        </xsl:element>

    </xsl:template>

    <xsl:template name="repeat">
        <xsl:for-each select="./*">
            <xsl:call-template name="reverse_template"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>

【讨论】:

  • 这很好用!!我需要在 xslt 之上进行一项修改。我想在节点名称“11_11_{NodeName}”中添加前缀作为我刚刚发现的 html 内容的谷歌翻译 ID。在反向映射时还要删除该前缀。你能建议怎么做吗?
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 2012-07-23
  • 2017-12-13
相关资源
最近更新 更多