什么XSL脚本会缩进我的数据?
例如:
<dtd name="cited">
<XMLDOC>
<cited year="2010">
<case>
No. 275 v. M.N.R.
<cite>
<yr>
2010
<pno cite="20101188">10</pno>
</yr>
</cite>
</case>
</cited>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St.
<cite>
<yr>
2010
<pno cite="20105133">9</pno>
</yr>
</cite>
</case>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
至:
<dtd name="cited">
<XMLDOC>
<cited year="2010"></cited>
<case>
No. 275 v. M.N.R.
</case>
<cite>
</cite>
<yr>
2010
</yr>
<pno cite="20101188">10</pno>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St
</case>
<cite>
</cite>
<yr>
2010
</yr>
<pno cite="20105133">9</pno>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
谢谢!
来自评论:
我想要的是应用正确的结束标签,如
Run Code Online (Sandbox Code Playgroud)<yr></yr> <pno cite="20101188">10</pno>
代替
Run Code Online (Sandbox Code Playgroud)<yr> 2010 <pno cite="20101188">10</pno> </yr>
Dim*_*hev 18
使用声明中indent="yes
指定的简单身份转换<xsl:output>
:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
此转换应用于提供的XML文档(未定义的实体
由其对应的字符实体替换 
):
<dtd name="cited">
<XMLDOC>
<cited year="2010">
<case>
No. 275 v. M.N.R.
<cite>
<yr>
2010
<pno cite="20101188">10</pno>
</yr>
</cite>
</case>
</cited>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St.
<cite>
<yr>
2010
<pno cite="20105133">9</pno>
</yr>
</cite>
</case>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
使用AltovaXML运行时生成:
<dtd name="cited">
<XMLDOC>
<cited year="2010">
<case>
No. 275 v. M.N.R.
<cite>
<yr>
2010
<pno cite="20101188">10</pno></yr>
</cite></case>
</cited>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St.
<cite>
<yr>
2010
<pno cite="20105133">9</pno></yr>
</cite></case>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
与Saxon 6.5.4一起运行时,相同的转换产生:
<dtd name="cited">
<XMLDOC>
<cited year="2010">
<case>
No. 275 v. M.N.R.
<cite>
<yr>
2010
<pno cite="20101188">10</pno>
</yr>
</cite>
</case>
</cited>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St.
<cite>
<yr>
2010
<pno cite="20105133">9</pno>
</yr>
</cite>
</case>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
因此,根据使用的XSLT 1.0处理器,输出大不相同.Saxon解析并且不会丢弃每个仅限空白的节点,这加上缩进会产生太多的空白区域.
解决方法是使用以下方法显式地导致仅删除空白节点:
<xsl:strip-space elements="*"/>
Run Code Online (Sandbox Code Playgroud)
所以,当这个转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
与Saxon针对相同的源XML文档运行,输出现在是:
<dtd name="cited">
<XMLDOC>
<cited year="2010">
<case>
No. 275 v. M.N.R.
<cite>
<yr>
2010
<pno cite="20101188">10</pno>
</yr>
</cite>
</case>
</cited>
</XMLDOC>
<XMLDOC>
<case>
Wellesley St.
<cite>
<yr>
2010
<pno cite="20105133">9</pno>
</yr>
</cite>
</case>
</XMLDOC>
</dtd>
Run Code Online (Sandbox Code Playgroud)
AltovaXML和许多其他XSLT 1.0处理器(.NET的XslCompiledTransform,XslTransform)也可以生成运行最后一次转换的精美缩进输出.
更新:
就在最近他的评论中,OP泄露了重要的新要求,这使得这个问题完全不仅仅是"缩进"......
来自评论:
我想要的是应用正确的结束标签,如
Run Code Online (Sandbox Code Playgroud)<yr></yr> <pno cite="20101188">10</pno>
代替
Run Code Online (Sandbox Code Playgroud)<yr> 2010 <pno cite="20101188">10</pno> </yr>
这是转换,产生想要的输出:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="yr">
<yr>
<xsl:apply-templates select="text()[1]"/>
</yr>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!-- output xml and indent -->
<xsl:output method="xml" indent="yes"/>
<!-- copy all elements and their attributes -->
<xsl:template match="* | @*">
<xsl:copy><xsl:copy-of select="@*"/><xsl:apply-templates/></xsl:copy>
</xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17491 次 |
最近记录: |