如何从 XSL 3.0 映射中获取字符串
How to get a string from an XSL 3.0 Map
我有一个 XSL 地图
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE stylesheet>
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:functx="http://www.functx.com"
xmlns:map="http://www.w3.org/2005/xpath-functions/map">
<xsl:param name="settings" select="'https://testurl.com' || '/_resources/includes/settings.xml'"/>
<xsl:template name="sidenav">
<map key="style" xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:choose>
<xsl:when test="doc-available($settings)">
<string key="navcss" select="doc($settings)/document/settings/ouc:div[@label='section-menu-type']"/>
</xsl:when>
<xsl:otherwise>
<string key="navcss" select="$nav-css"/>
</xsl:otherwise>
</xsl:choose>
</map>
"style" : <xsl:value-of select="map:get('style')('navcss')"/>
</xsl:template>
<xsl:call-template name="sidenav"/>
</xsl:stylesheet>
当我尝试使用以下代码获取值时,我得到:“致命错误:未知类型映射”
"style" : <xsl:value-of select="map:get('style')('navcss')"/>
如果我用这个代替它:
<xsl:variable name="map" select="map {
'navcss' : if(doc-available($settings)) then doc($settings)/document/settings/ouc:div[@label='section-menu-type'] else 'd3',
}"/>
<xsl:value-of select="map:get($map, 'navcss')"/>
我明白了。我的问题是,您可以创建一个地图元素并获取其类似于 map 函数的键,还是只需要使用 map xpath 函数?
XSLT 3.0 和 XPath 3.1 中定义的 JSON 的 XML 表示使用这样的 map
元素来表示 JSON 对象,您可以将这样的 XML 到 JSON 与 xml-to-json
并将其提供给 parse-json
;另一方面,要在 XSLT 3.0 中创建地图,我建议使用 xsl:map
和 xsl:map-entry
元素或简单地使用 XPath 3.1 表达式:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:param name="json-xml">
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="foo">bar</string>
<number key="pi">3.1415927</number>
</map>
</xsl:param>
<xsl:variable name="map1" select="xml-to-json($json-xml) => parse-json()"/>
<xsl:param name="map2" as="map(*)">
<xsl:map>
<xsl:map-entry key="'foo'" select="'bar'"/>
<xsl:map-entry key="'pi'" select="math:pi()"/>
</xsl:map>
</xsl:param>
<xsl:template match="root">
<section>
<h2>Example</h2>
<p>{$map1?pi}</p>
<p>{$map1?foo}</p>
</section>
<section>
<h2>Example</h2>
<p>{$map2?pi}</p>
<p>{$map2?foo}</p>
</section>
</xsl:template>
至于你在评论中的表达方式,好像你可以用例如
select="if (doc-available($settings))
then map { 'navcss' : doc($settings)/document/settings/ouc:div[@label='navcss'], 'navtype' : doc($settings)/document/settings/ouc:div[@label='navtype']}
else map { 'navcss' : 'd3', 'navtype' : 'sectionnav' }"
我没有详细说明所有地图属性,但我希望清楚如何列出更多属性。
我有一个 XSL 地图
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE stylesheet>
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:functx="http://www.functx.com"
xmlns:map="http://www.w3.org/2005/xpath-functions/map">
<xsl:param name="settings" select="'https://testurl.com' || '/_resources/includes/settings.xml'"/>
<xsl:template name="sidenav">
<map key="style" xmlns="http://www.w3.org/2005/xpath-functions">
<xsl:choose>
<xsl:when test="doc-available($settings)">
<string key="navcss" select="doc($settings)/document/settings/ouc:div[@label='section-menu-type']"/>
</xsl:when>
<xsl:otherwise>
<string key="navcss" select="$nav-css"/>
</xsl:otherwise>
</xsl:choose>
</map>
"style" : <xsl:value-of select="map:get('style')('navcss')"/>
</xsl:template>
<xsl:call-template name="sidenav"/>
</xsl:stylesheet>
当我尝试使用以下代码获取值时,我得到:“致命错误:未知类型映射”
"style" : <xsl:value-of select="map:get('style')('navcss')"/>
如果我用这个代替它:
<xsl:variable name="map" select="map {
'navcss' : if(doc-available($settings)) then doc($settings)/document/settings/ouc:div[@label='section-menu-type'] else 'd3',
}"/>
<xsl:value-of select="map:get($map, 'navcss')"/>
我明白了。我的问题是,您可以创建一个地图元素并获取其类似于 map 函数的键,还是只需要使用 map xpath 函数?
XSLT 3.0 和 XPath 3.1 中定义的 JSON 的 XML 表示使用这样的 map
元素来表示 JSON 对象,您可以将这样的 XML 到 JSON 与 xml-to-json
并将其提供给 parse-json
;另一方面,要在 XSLT 3.0 中创建地图,我建议使用 xsl:map
和 xsl:map-entry
元素或简单地使用 XPath 3.1 表达式:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:map="http://www.w3.org/2005/xpath-functions/map"
xmlns:math="http://www.w3.org/2005/xpath-functions/math"
exclude-result-prefixes="#all"
expand-text="yes"
version="3.0">
<xsl:param name="json-xml">
<map xmlns="http://www.w3.org/2005/xpath-functions">
<string key="foo">bar</string>
<number key="pi">3.1415927</number>
</map>
</xsl:param>
<xsl:variable name="map1" select="xml-to-json($json-xml) => parse-json()"/>
<xsl:param name="map2" as="map(*)">
<xsl:map>
<xsl:map-entry key="'foo'" select="'bar'"/>
<xsl:map-entry key="'pi'" select="math:pi()"/>
</xsl:map>
</xsl:param>
<xsl:template match="root">
<section>
<h2>Example</h2>
<p>{$map1?pi}</p>
<p>{$map1?foo}</p>
</section>
<section>
<h2>Example</h2>
<p>{$map2?pi}</p>
<p>{$map2?foo}</p>
</section>
</xsl:template>
至于你在评论中的表达方式,好像你可以用例如
select="if (doc-available($settings))
then map { 'navcss' : doc($settings)/document/settings/ouc:div[@label='navcss'], 'navtype' : doc($settings)/document/settings/ouc:div[@label='navtype']}
else map { 'navcss' : 'd3', 'navtype' : 'sectionnav' }"
我没有详细说明所有地图属性,但我希望清楚如何列出更多属性。