簡體   English   中英

如何在 xslt 1.0 中將返回 (|) 替換為字符串“\n”? [XML 多行 base64 到 json]

[英]How to replace return (
 | 
) by the string “\n” in xslt 1.0 ? [XML multiline base64 to json]

我有一個 xml 我需要變成一個 json。 除了 base64 多線之外,我基本上都很好

<file>TU0...AAA
FOO...BCD
FOO...012
FOO...ZYX</file>

在 json 中,多行是不可能的,這應該僅在 1 行中重寫為

"file":"TU0...AAA\nFOO...BCD\nFOO...012\nFOO...ZYX" 

用“real”兩字符字符串“\n”連接每一行。

我可以在 xslt 1.0 中做到這一點嗎?

我知道我可以使用翻譯,但這僅適用於一個字符。 我會盡力

translate(.,'&#10;',' ') 

這將用空格替換返回,也許這不會破壞 json 的 base64 解碼。

但是,如果我想以“正確的方式”來做,我想我需要自定義函數。 在我的情況下,回報似乎是“”。 但是,如果有人提供適用於所有組合 ( ) 的解決方案,那就太好了。

我的主要目標是 chrome web 瀏覽器,但在所有瀏覽器中運行良好會很棒。

如果您只想擺脫換行符,可以使用normalize-space($string) function,例如:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    exclude-result-prefixes="xd"
    version="1.0">
    <xd:doc scope="stylesheet">
        <xd:desc>
            <xd:p><xd:b>Created on:</xd:b> Apr 22, 2020</xd:p>
            <xd:p><xd:b>Author:</xd:b> bwb</xd:p>
            <xd:p>generates a normalized text output of the file element</xd:p>
        </xd:desc>
    </xd:doc>

    <xsl:output method="text"/>

    <xsl:template match="/">
        <xsl:apply-templates select="file"/>
    </xsl:template>

    <xsl:template match="file">
        <xsl:value-of select="normalize-space(.)"/>
    </xsl:template>

</xsl:stylesheet>

然后,您仍然可以用其他東西替換空格(forJSON 可能用,

如果您確實想要\n ,您可以嘗試以下樣式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    exclude-result-prefixes="xs math xd"
    version="1.0">
    <xd:doc scope="stylesheet">
        <xd:desc>
            <xd:p><xd:b>Created on:</xd:b> Apr 22, 2020</xd:p>
            <xd:p><xd:b>Author:</xd:b> bwb</xd:p>
            <xd:p>Override default text() template by adding a search and replace funtionality</xd:p>
        </xd:desc>
    </xd:doc>

    <xsl:output method="text"/>

    <xd:doc scope="component">
        <xd:desc>The string that should be searched and replaced by $param-replaceString</xd:desc>
    </xd:doc>
    <xsl:param name="param-searchString" select="'&#10;    '"/><!-- actually you also wnat to replace the whitespaces, that's why the searchString looks so  strange -->

    <xd:doc>
        <xd:desc>The string that replace any occurence of $param-searchString</xd:desc>
    </xd:doc>
    <xsl:param name="param-replaceString" select="'\n'"/>

    <xd:doc scope="component">
        <xd:desc>Override for default text() template testing for $param-searchString presence and calling replace template</xd:desc>
    </xd:doc>
    <xsl:template match="text()">
        <xsl:choose>
            <xsl:when test="contains(., $param-searchString)">
                <xsl:call-template name="replace">
                    <xsl:with-param name="InputString" select="."/>
                    <xsl:with-param name="searchString" select="$param-searchString"/>
                    <xsl:with-param name="replaceString" select="$param-replaceString"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <xsl:template name="replace">
        <xsl:param name="InputString"/>
        <xsl:param name="searchString"/>
        <xsl:param name="replaceString"/>

        <xsl:choose>
            <xsl:when test="contains($InputString, $searchString)">
                <xsl:variable name="token-before-first-match" select="substring-before($InputString, $searchString)"/>
                <xsl:variable name="token-after-first-match" select="substring-after(., concat($token-before-first-match, $searchString))"/>
                <xsl:value-of select="concat($token-before-first-match, $replaceString)"/>
                <xsl:choose>
                    <xsl:when test="contains($token-after-first-match, $searchString)">
                        <xsl:call-template name="replace">
                            <xsl:with-param name="InputString" select="$token-after-first-match"/>
                            <xsl:with-param name="searchString" select="$searchString"/>
                            <xsl:with-param name="replaceString" select="$replaceString"/>
                        </xsl:call-template>
                    </xsl:when>
                    <xsl:otherwise>
                        <xsl:value-of select="$token-after-first-match"/>
                    </xsl:otherwise>
                </xsl:choose>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$InputString"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM