是否有一种无需手动即可将XML固定为可读性更好的方法?

时间:2018-10-16 13:13:34

标签: xml xslt

我有一个来自第三方的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>

3 个答案:

答案 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更具可读性

当您指定在序列化输出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>