首页 > 解决方案 > 在 XSLT 中将 XML 解析为字符串

问题描述

我不知道如何将 XML 节点传递给 XSLT 中的 javascript 变量。输入 XML 包含应用程序主屏幕的数据,因此它是动态的。我需要传递一个将成为应用程序全局模型的 XML。我不知道是否有更简单的方法可以用 XSLT 做到这一点,但我正在尝试将 XML 包装到 String 中,然后将其与 XMLModel 相关联,这似乎不对,但我不知道如何将 XML 传递到 XSLT 内的 SAPUI5 控件。如果有人可以帮助我很感激。

输入 XML:

<?xml version="1.0" encoding="UTF-8"?>
<Profile Accessibility="false" CREATED_BY="Administrator"
    Country="US" PRINCIPAL_CREATION_DATE="0001387234199378"
    PRINCIPAL_MODIFY_DATE="0001564488020308" locale="en_US" uniquename="admin">
    <NavigationItems>
        <NavigationItem frame="" label="OEE"
            target="/XMII/CM/App/index.html" />
        <NavigationItem frame="" label="Admin" target="">
            <NavigationItem frame="" label="Administrator" target="">
                <NavigationItem frame="_blank" label="Promoção"
                    target="/XMII/CM/link1.html" />
                <NavigationItem frame="_blank" label="Label02"
                    target="/XMII/CM/link2.html" />
                <NavigationItem frame="_blank" label="Label03"
                    target="/XMII/CM/link3.html" />
                <NavigationItem frame="_blank" label="Label04"
                    target="/XMII/CM/link4.html" />
                <NavigationItem frame="_blank" label="Label05"
                    target="/XMII/CM/link5.html" />
            </NavigationItem>
        </NavigationItem>
    </NavigationItems>
</Profile>

XSL 转换:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" media-type="text/html" encoding="UTF-8" />

    <xsl:variable name="Profile">
        <xsl:value-of select="/Profile" />
    </xsl:variable>

    <xsl:template match="/">
        <html>
            <head>
                <meta charset="utf-8" />
            </head>
            <script>
                sap.ui.getCore().attachInit(function () {
                sap.ui.require([
                "sap/m/Shell",
                "sap/ui/core/ComponentContainer",
                "sap/ui/model/xml/XMLModel"
                ], function
                (Shell, ComponentContainer, XMLModel) {
                new Shell({
                app: new
                ComponentContainer({
                height : "100%",
                name : "App"
                }
                )}          
                ).placeAt("container");
                    var dataProfile = &quot;<xsl:value-of select="$Profile" />&quot;;

                var oModel = new XMLModel();
                oModel.setXML(dataProfile);
                sap.ui.getCore().setModel(oModel,"Profile");    
                });
                });
            </script>
            <body class="sapUiBody">
                <xsl:element name="div">
                    <xsl:attribute name="data-sap-ui-component">main</xsl:attribute>
                    <xsl:attribute name="data-name">app</xsl:attribute>
                    <xsl:attribute name="data-id">container</xsl:attribute>
                    <xsl:attribute name="data-settings">'{"id": "app"}'</xsl:attribute>
                </xsl:element>
            </body>
        </html>
    </xsl:template>  
</xsl:stylesheet>

HTML 输出:

<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
</head>
<script>
                sap.ui.getCore().attachInit(function () {
                sap.ui.require([
                "sap/m/Shell",
                "sap/ui/core/ComponentContainer",
                "sap/ui/model/xml/XMLModel"
                ], function
                (Shell, ComponentContainer, XMLModel) {
                new Shell({
                app: new
                ComponentContainer({
                height : "100%",
                name : "App"
                }
                )}          
                ).placeAt("container");
                    var dataProfile = "












";

                var oModel = new XMLModel();
                oModel.setXML(dataProfile);
                sap.ui.getCore().setModel(oModel,"Profile");    
                });
                });
            </script>
<body class="sapUiBody">
<div data-sap-ui-component="main" data-name="app" data-id="container" data-settings="'{&quot;id&quot;: &quot;app&quot;}'"></div>
</body>
</html>

预计出炉:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title></title>

<script id="sap-ui-bootstrap"
    src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js"
    data-sap-ui-theme="sap_fiori_3"
    data-sap-ui-xx-bindingSyntax="complex"
    data-sap-ui-resourceroots='{
            "app": "./"
        }'
    data-sap-ui-oninit="module:sap/ui/core/ComponentSupport"
    data-sap-ui-compatVersion="edge" data-sap-ui-async="true">
</script>

<script>
        sap.ui.getCore().attachInit(function () {
            sap.ui.require([
                "sap/m/Shell",
                "sap/ui/core/ComponentContainer",
                "sap/ui/model/xml/XMLModel"
            ], function (Shell, ComponentContainer, XMLModel) {
                new Shell({
                    app: new ComponentContainer({
                        height : "100%",
                        name : "App"
                    })
                }            
                ).placeAt("container");

                var dataProfile = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<Profile Accessibility=\"false\" CREATED_BY=\"Administrator\" " +
                    "Country=\"US\" PRINCIPAL_CREATION_DATE=\"0001387234199378\" " +
                    "PRINCIPAL_MODIFY_DATE=\"0001564488020308\" locale=\"en_US\" uniquename=\"admin\"> " +
                    "<NavigationItems> " +
                        "<NavigationItem frame=\"\" label=\"OEE\" " +
                            "target=\"/XMII/CM/App/index.html\" /> " +
                        "<NavigationItem frame=\"\" label=\"Admin\" target=\"\"> " +
                            "<NavigationItem frame=\"\" label=\"Administrator\" target=\"\"> " +
                                "<NavigationItem frame=\"_blank\" label=\"Promoção\" " +
                                    "target=\"/XMII/CM/link1.html\" /> " +
                                "<NavigationItem frame=\"_blank\" label=\"Label02\" " +
                                    "target=\"/XMII/CM/link2.html\" /> " +
                                "<NavigationItem frame=\"_blank\" label=\"Label03\" " +
                                    "target=\"/XMII/CM/link3.html\" /> " +
                                "<NavigationItem frame=\"_blank\" label=\"Label04\" " +
                                    "target=\"/XMII/CM/link4.html\" /> " +
                                "<NavigationItem frame=\"_blank\" label=\"Label05\" " +
                                    "target=\"/XMII/CM/link5.html\" /> " +
                            "</NavigationItem> " +
                        "</NavigationItem> " +
                    "</NavigationItems> " +
                "</Profile>";

                var oModel = new XMLModel();
                oModel.setXML(dataProfile);
                sap.ui.getCore().setModel(oModel,"Profile");

            }); 
        });
    </script>
</head>
<body class="sapUiBody">
    <div data-sap-ui-component data-name="app"
        data-id="container" data-settings='{"id" : "mes"}'></div>
</body>
</html>

需要帮忙。谢谢。

标签: xslt

解决方案


你用 - 初始化你的Profile变量,xsl:value-of这是空的。改为使用xsl:copy-of(另见此处):

<xsl:variable name="Profile">
    <xsl:copy-of select="/Profile" />
</xsl:variable>

然后,如果您可以稍微快速地避免转义 XML 字符串的引号,请将其&quot;替换&apos;var dataProfile

var dataProfile = &apos;<xsl:copy-of select="$Profile" />&apos;;

XSLT-3.0解决方案正在对序列化的XML 输入应用替换:

var dataProfile = &apos;<xsl:value-of select="replace(serialize($Profile),'&quot;','\\&quot;')" />&apos;;

然后引号将被正确转义,其他 UTF-8 字符也将被传递。


推荐阅读