使用 XSLTPROC 覆盖特定标签中包含的字符数据(未标记的文本),并将另一个标签添加到该块中

问题描述 投票:0回答:1

我需要根据特定标签中包含的未标记文本对一些 .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 节点注入是否会位于该标签之后的正确位置?

如有任何帮助,我们将不胜感激。

xml xslt transformation
1个回答
0
投票

听起来好像你想要类似的东西

<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%%')]">

在浏览器中使用 libxslt/lxml 进行在线小提琴

© www.soinside.com 2019 - 2024. All rights reserved.