Java STX CDATA解析

时间:2018-08-31 06:09:14

标签: java xslt cdata confluence stx

我正在尝试将XML汇合的匿名化。 我找到了他们的出口清洁剂罐:

https://confluence.atlassian.com/doc/content-anonymizer-for-data-backups-134795.html

我已修改clean.stx来删除所有用户,例如:

<stx:template match="object[@class='ConfluenceUserImpl']/property[@name='name']/text() | object[@class='ConfluenceUserImpl']/property[@name='lowerName']/text() | object[@class='ConfluenceUserImpl']/id[@name='key']/text() | property[@class='ConfluenceUserImpl']/id[@name='key']/text()">
    <stx:value-of select="translate(., '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx')"/>
</stx:template>

我还需要使用正则表达式或类似内容来修改CDATA,以删除融合页面正文中的用户提及。

CDATA看起来像这样:

<property name="body">
    <![CDATA[
        <p>
            <ac:link>
                <ri:user ri:userkey="8a8300716489cc7d016489ce009a0000" />
            </ac:link>
        </p>
    ]]>
</property>

这里我只需要将ri:userkey的值替换为xxx或类似的值即可。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

没关系, 我现在使用的stx的joost java版本比attlassian在jar中使用的版本要新: http://joost.sourceforge.net/

我可以在此处使用replace()并使用stx:cdata禁用转义:

    <stx:template match="property[@name='body']/cdata()">
    <stx:cdata>
        <stx:value-of select="replace(., '(ri:userkey=).*?\s', '$1&quot;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&quot; ')" />
    </stx:cdata>
</stx:template>