我需要根据特定标签中包含的未标记文本对一些 .xml 文件执行 XML 转换。问题在于,尽管未标记的文本是不变的,但“活动”节点名称可能会有所不同。因此,我不能依赖活动节点名称,而只能依赖特定标签中的未标记文本。我应该查找然后替换的未标记文本是:
%%some/Global%%
标签树将始终保持不变,如下所示: ProcessDefinition/activity[名称有所不同]/config/endpointURL/
如果我匹配标签树和未标记文本的组合,那么只有那时我才应该将未标记文本替换为:
%%new/Code%%
并在端点URL标签下添加ssl块(在配置块中):
<ns999:ssl xmlns:ns999="http://some/xmlns/target">
<ns999:strongCipherSuitesOnly>true</ns999:strongCipherSuitesOnly>
<ns999:cert isRef="true">/.folder</ns999:cert>
</ns999:ssl>
一般来说...
输入:
<pd:ProcessDefinition xmlns:pfx6="SOME DATA HERE">
<pd:activity name="THIS NAME VARIES FROM EACH PROJECT TO PROJECT">
<pd:x>00</pd:x>
<pd:y>00</pd:y>
<config>
<endpointURL>%%some/Global%%</endpointURL>
</config>
<pd:inputBindings>
SOME UNIMPORTANT DATA
</pd:inputBindings>
</pd:activity>
</pd:ProcessDefinition>
所需输出:
<pd:ProcessDefinition xmlns:pfx6="SOME DATA HERE">
<pd:activity name="THIS NAME VARIES FROM EACH PROJECT TO PROJECT">
<pd:x>00</pd:x>
<pd:y>00</pd:y>
<config>
<endpointURL>%%new/Code%%</endpointURL>
<ns999:ssl xmlns:ns999="http://some/xmlns/target">
<ns999:strongCipherSuitesOnly>true</ns999:strongCipherSuitesOnly>
<ns999:cert isRef="true">/.folder</ns999:cert>
</ns999:ssl>
</config>
<pd:inputBindings>
SOME UNIMPORTANT DATA
</pd:inputBindings>
</pd:activity>
</pd:ProcessDefinition>
我尝试过以下方法:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns999="http://some/xmlns/test_2"
xmlns="http://some/xmlns/test_1"
xmlns:tc="http://some/xmlns/test_1" exclude-result-prefixes="tc">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="endpointURL">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<ns999:ssl xmlns:ns999="http://some/xmlns/target">
<ns999:strongCipherSuitesOnly>true</ns999:strongCipherSuitesOnly>
<ns999:cert isRef="true">/.folder</ns999:cert>
</ns999:ssl>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我找不到如何通过未标记的文本 %%some/Global%% 过滤端点URL? 并且,ssl 节点注入是否会位于该标签之后的正确位置?
如有任何帮助,我们将不胜感激。
听起来好像你想要类似的东西
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns999="http://some/xmlns/test_2"
xmlns="http://some/xmlns/test_1"
xmlns:tc="http://some/xmlns/test_1" exclude-result-prefixes="tc">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="endpointURL[. = '%%some/Global%%']">
<xsl:call-template name="identity"/>
<ns999:ssl xmlns:ns999="http://some/xmlns/target">
<ns999:strongCipherSuitesOnly>true</ns999:strongCipherSuitesOnly>
<ns999:cert isRef="true">/.folder</ns999:cert>
</ns999:ssl>
</xsl:template>
</xsl:stylesheet>
如果该值仅作为端点 URL 的一部分,则可以将
<xsl:template match="endpointURL[. = '%%some/Global%%']">
更改为 <xsl:template match="endpointURL[contains(., '%%some/Global%%')]">
。