У меня есть следующий вход.
Ввод XML
<DOC>
<ID>1234</ID>
<TXT>
<A><DESC type="PERSON">George Washington</DESC> lived in a house called <DESC type="PLACE">Mount Vernon.</DESC></A>
</TXT>
</DOC>
Затем я применяю следующий XSLT
XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<DOC>
<xsl:for-each select="DOC/*">
<xsl:copy>
<xsl:value-of select="current()"/>
</xsl:copy>
</xsl:for-each>
<xsl:apply-templates select="DOC/TXT"/>
</DOC>
</xsl:template>
<xsl:template match="TXT">
<xsl:element name="TXT">
<xsl:for-each select="S">
<xsl:element name="{local-name()}">
<xsl:for-each select="*">
<xsl:variable name="type" select="@type"/>
<xsl:element name="{concat(name(), '_', $type)}">
<xsl:value-of select="current()"/>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Из этого он производит этот вывод.
выход
<DOC>
<ID>1234</ID>
<TXT>
George Washington lived in a house called Mount Vernon.
</TXT>
<TXT>
<A>
<DESC_PERSON>George Washington</DESC_PERSON>
<DESC_PLACE>Mount Vernon</DESC>
</A>
</TXT>
</DOC>
Это почти то, что я хочу, однако мне нужно переименовать этот первый тег TXT в RAW_TXT, потому что позже мне нужно использовать схему Avro в NiFi, и она выдает ошибку, когда схема имеет повторяющиеся теги. Я попытался добавить приведенный ниже код в XSLT, но он просто создает два идентичных поля raw_txt и удаляет DESC_PERSON
и DESC_PLACE
.
Покушение
<xsl:template match="TXT">
<RAW_TXT><xsl:apply-templates select="@*|node()" /></RAW_TXT>
</xsl:template>