我正在尝试将 xml 转换为 groovy 中谷歌翻译 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。
有人可以帮忙吗?
最佳答案
为此,您可以使用 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>
关于java - 使用 "P"重命名节点名称,并将属性添加为旧名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51779945/