我有一个XML文件,格式不正确.(它基本上是用作内容工具一部分的DHTML文件,大多数html标签都没有结束).
现在这个XML文件是我们团队无法控制的.它来自不同的团队.
当我们尝试对这些XML文件进行XSLT转换时,就会出现问题.
在进行XSLT转换之前,它会尝试验证XML文件并抛出一条错误,指出XML文档无效.
在XSLT中是否有一种方法可以说不要验证需要转换的XML文件.我们使用XMLSpy进行测试.
所以我有一个显示员工档案的模板.像这样:
<div class="row">
<li></li>
<li></li>
<li></li>
<li></li>
</div>
<div class="row">
<li></li>
<li></li>
<li></li>
<li></li>
</div>
Run Code Online (Sandbox Code Playgroud)
在我的XSLT For-each循环中,我需要一种方法来围绕每组4个列表项包装"div class = row".我可以测试计数以查看我在哪个元素,但问题是在XSLT中包装4个组,因为你不能使用模数.
我想读取XSLT中的XML文件并检查其节点.如果它们与我应用转换的XML节点的值匹配,则获取XML节点的值并使用它来构造新的XML结构.
这是一个说明我的问题的例子.我想很多人都可以用这个问题来参考来实现类似的功能.
Referenced.xml
<xml>
<root>
<Id id = "1">
<fields>
<field>
<name> Name1 </name>
<value> Val1 </value>
</field>
<field>
<name> Name2 </name>
<value> Val2 </value>
</field>
</fields>
</Id>
<Id id = "2">
...
</Id>
</root>
</xml>
Run Code Online (Sandbox Code Playgroud)
Xml.xml
<XML>
<Fields>
<Id id = "1">
<F1> Value1 </F1>
<F2> Value2 </F2>
<F1> Value3 </F1>
<F4> Value4 </F4>
</Id>
</Fields>
</XML>
Run Code Online (Sandbox Code Playgroud)
现在,我想创建一个转换,这将遍历XML文件(Referenced.xml),并检查其中Id两个XML的比赛里,然后,该ID内,Name1 = F1无论在哪里,然后,取"价值"为"名"和创建像XML这样的XML结构
<outputXml>
<Field id="Val1">
<val> Value1 </val>
</Field>
<Field id="Val2">
<val> Value2 </val>
</Field> ... and …Run Code Online (Sandbox Code Playgroud) 我有这个XML:
<bookings>
<booking>
<event>Christmas Party</event>
<source>Internet</source>
</booking>
<booking>
<event>Church day</event>
<source>Television</source>
</booking>
<booking>
<event>Port Anniversary</event>
<source>Television</source>
</booking>
<booking>
<event>Disco Fever</event>
<source>Internet</source>
</booking>
<booking>
<event>Party Night</event>
<source>Internet</source>
</booking>
<booking>
<event>Christmas Party</event>
<source>Flyer</source>
</booking>
</bookings>
Run Code Online (Sandbox Code Playgroud)
我需要像这样输出:
预订的主要营销来源:
- 互联网:3个预订
- 电视:2个预订
- 传单:1个预订
XSLT甚至可以实现吗?
谢谢你的帮助!
嗨,这适用于","和其他分隔符,但它不适用于PIPE(|)符号只有它给FORX0003:tokenize()中的正则表达式不能与零长度字符串匹配
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text/text()" name="tokenize">
<xsl:param name="separator" select="'|'"/>
<xsl:for-each select="tokenize(.,$separator)">
<item>
<xsl:value-of select="normalize-space(.)"/>
</item>
</xsl:for-each>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
我有一个XML文件,我想在两个单独的网页上显示,有两个不同的样式表.问题是样式表是在XML文件中指定的,通常会将其排除在外.我试图通过从转换本身拆分数据并将其作为单独的文件包含来解决这个问题.像这样的东西:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="news.xsl" type="text/xsl"?>
<!DOCTYPE doc [
<!ENTITY items SYSTEM "news_items.xml">
]>
<wrapper>
&items;
</wrapper>
Run Code Online (Sandbox Code Playgroud)
这里news_items.xml是一个纯XML文件,没有头文件和一个根节点,如下所示:
<items>
<item>
---
</item>
<item>
---
</item>
<item>
---
</item>
</items>
Run Code Online (Sandbox Code Playgroud)
样式表news.xsl遍历重复节点,并生成格式良好的输出.这种安排允许我用不同的样式表重复练习,而不重复数据.它适用于Chrome,但不适用于IE或我定位的任何webkit浏览器.
有一个更好的方法吗?我希望能够使用单个XML文件,因为内容是相当动态的.
后来:我实际上使用PHP XSLTProcessor类在服务器端解决了这个问题.根据提出的问题条款,这不是一个选项,为此我道歉.这不是我特别熟悉的领域,即使他们提交了一个完美的解决方案,我也无法向所有人颁发赏金.对于那个很抱歉.
我可以在函数内调用xsl函数吗?我只想比较之前的值和当前值.例如:
<xsl:value-of select="//row[(position()-1)]/MONTH_ID" />
Run Code Online (Sandbox Code Playgroud)
但是,下面的代码是可以的:
<xsl:value-of select="number(position())-1" />
Run Code Online (Sandbox Code Playgroud) 我有一个如下的XSLT并将此xslt应用到输入xml [粘贴在下面],它正常工作,除了需要澄清的一件事.
这是输入xml
<Test>
<Experiment id='1'>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='8am' reading='y'/>
</Dish1>
<Dish2>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='8am' reading='y'/>
</Dish2>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='2pm' reading='y'/>
</Dish1>
<Dish2>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='2pm' reading='y'/>
</Dish2>
</Experiment>
<Experiment id='2'>
<Dish1>
<Conditions pressure='x' temp='y'/>
<Measurement timeStamp='9am' reading='y'/>
</Dish1>
</Experiment>
</Test>
Run Code Online (Sandbox Code Playgroud)
这是xslt
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Experiment">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:for-each-group select="*" group-by="local-name()">
<xsl:copy>
<xsl:apply-templates select="current-group()" />
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="Experiment/*">
<Observation>
<xsl:apply-templates select="*/@*" …Run Code Online (Sandbox Code Playgroud) 如何使用XSLT 2.0验证电子邮件地址?是否有预定义的方法,或者我必须构建正则表达式?
谢谢
任何人都可以帮我解决这个问题.我有带标签的XML:
Data before ....
<table1> some data 1</table1>
<table1> some data 2 </table1>
Data after ....
Run Code Online (Sandbox Code Playgroud)
我怎么能用一些xslt包装这个标签所以我会得到这个:
Data before ....
<tab1><table1> some data 1</table1></tab1>
<tab1><table1> some data 2 </table1></tab1>
Data after ....
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?如果有人可以帮助我的话,非常感谢你的帮助,eoglasi