我有一个来自第三方的XML文件,在XSLT中很难指定值。下面是一个“对象”的示例。我发现很难在字符串之间指定值。 docrev,其值为“-”,例如。
<object level="1" id="2018488">
<integer>
<name>level</name>
<value>1</value>
</integer>
<string>
<name>docrev</name>
<value>-</value>
</string>
<string>
<name>DocID</name>
<value>2018488</value>
</string>
<string>
<name>Custom_Pos</name>
</string>
<string>
<name>Custom_Qty</name>
</string>
<string>
<name>DocDescr</name>
<value>Levy</value>
</string>
<date>
<name>StatusDate</name>
<value>2012-04-30</value>
</date>
</object>
答案 0 :(得分:1)
从您的评论看来,好像在检索和打印<value>
元素的值时遇到麻烦。
您发布的代码将查找文档中不存在的<docrev>
元素。
听起来好像您要选择具有同级<value>
元素且值为<name>
的{{1}}元素的值:
docrev
如果只需要<xsl:value-of select="/object/*[name='docrev']/value"/>
元素中的值,则可以使该XPath更具体:
<string>
答案 1 :(得分:1)
好吧,<xsl:value-of select="docrev"/>
应该在XPath中选择一个名为docrev
的元素,因此它不能基于字符串值docrev
选择一个元素。
但是,在XSLT中,您可以轻松定义键以按某个值选择元素(或在常规节点中),因此对于您的示例,您可以使用键
<xsl:key name="value" match="object/*/value" use="../name"/>
,然后在示例上下文中,您可以使用key('value', 'docrev')
分别选择相应的value
元素<xsl:value-of select="key('value', 'docrev')"/>
来输出其值:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="value" match="object/*/value" use="../name"/>
<xsl:template match="/">
<xsl:value-of select="key('value', 'docrev')"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/6qVRKwW/1
或者在更广泛的上下文中,您可以首先使用另一个键object
通过id
属性的<xsl:key name="id" match="object" use="@id"/>
属性来索引<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:key name="id" match="object" use="@id"/>
<xsl:key name="value" match="object/*/value" use="../name"/>
<xsl:template match="/">
<xsl:value-of select="key('value', 'docrev', key('id', '2018488'))"/>
</xsl:template>
</xsl:stylesheet>
元素,然后将其与上一个键一起使用:
ID
https://xsltfiddle.liberty-development.net/6qVRKwW
使用模式或DTD,您还可以将某些属性或节点预定义为id
,然后使用与上述key
相似的{{1}}函数。
答案 2 :(得分:0)
当您指定在序列化输出XML时使用缩进时,XSLT输出将更具可读性:
<xsl:output method="xml" indent="yes"/>
如果您的唯一目的是漂亮地打印XML,则可以通过身份转换通过XSLT运行任何XML:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>