将XSLT属性解析为一个数组。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将XSLT属性解析为一个数组。相关的知识,希望对你有一定的参考价值。
我正在使用XSLT从XML创建html表单。表格是动态创建的。没有现成的团队模板。用户想要多少输入就有多少输入。我想让它尽可能的短,所以我使用属性来创建例如选择标签中的选项。问题是,我不知道如何将这个XML。
<input mapTo="dropdown" nameId="sampleId" inputDomain="[a, b, c, d, e]" />
变成:
<select id="sampleId">
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
<option value="d">d</option>
<option value="e">e</option>
</select>
我的问题正是 inputDomain
属性。我可以修改一个简单的方法,但我想把它保留在一个属性中(像一个数组)。这可能吗?或者你有更方便的想法?
答案
考虑下面的例子。
XML
<input mapTo="dropdown" nameId="sampleId" inputDomain="a,b,c,d,e" />
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="input">
<select id="sampleId">
<xsl:for-each select="tokenize(@inputDomain, ',')">
<option value="{.}">
<xsl:value-of select="." />
</option>
</xsl:for-each>
</select>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<select id="sampleId">
<option value="a">a</option>
<option value="b">b</option>
<option value="c">c</option>
<option value="d">d</option>
<option value="e">e</option>
</select>
演示: http:/xsltfiddle.liberty-development.net3MvmXiL
另一答案
如果你使用的是模式感知的XSLT 2或3(例如Saxon 9或10 EE),你可以将属性声明为以下类型 xs:NMTOKENS
并使用空格分隔的列表。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="input">
<xs:complexType>
<xs:attribute name="inputDomain" type="xs:NMTOKENS" use="required"/>
<xs:attribute name="mapTo" use="required" type="xs:NCName"/>
<xs:attribute name="nameId" use="required" type="xs:NCName"/>
</xs:complexType>
</xs:element>
</xs:schema>
然后用一个样式表处理
<input mapTo="dropdown" nameId="sampleId" inputDomain="a b c d e" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="schema.xsd"/>
可以使用 data
属性上的函数,使其拥有一个代币序列。
<?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"
expand-text="yes"
exclude-result-prefixes="#all"
version="3.0">
<xsl:template match="input[@mapTo = 'dropdown']">
<select id="{@nameId}">
<xsl:for-each select="data(@inputDomain)">
<option value="{.}">{.}</option>
</xsl:for-each>
</select>
</xsl:template>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="html" indent="yes" html-version="5"/>
<xsl:template match="/">
<html>
<head>
<title>Example</title>
</head>
<body>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
以上是关于将XSLT属性解析为一个数组。的主要内容,如果未能解决你的问题,请参考以下文章
将 XSLT 转换的 XML 片段写入 XMLStreamWriter
如何为 XSLT 代码片段配置 CruiseControl 的 C# 版本?
使用 XSLT 2.0/3.0 使用多个步骤将 CDATA 中的纯文本解析为 html。那里的一部分