如何仅在元素存在时才在元素之间放置文本?



我只在非常业余的水平上编码,我最近用XML文件进行了一个大型项目。基本上,我需要获取这些XML文件,并以格式良好,可读的方式显示它们。我想为我拥有的所有 XML 文件编写一个 XSLT 文件。

每个 XML 文件都有多个同名的元素<datafield tag="650">。 嵌套在这些元素中的是其他几个元素。总会有<subfield code="a">.在此之后可能没有其他子字段,或者可能有任意组合的<subfield code="x"><subfield code="z"><subfield code"v">。我想在子字段之间放置连字符,但前提是这些子字段可见。

例如,我试过这个:

.XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="so01.xsl"?>
<record>
<datafield tag="650" ind1=" " ind2="0">
<subfield code="a">Anthropology</subfield>
<subfield code="z">Southwest, New</subfield>
<subfield code="v">Periodicals.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="0">
<subfield code="a">Indians of North America</subfield>
<subfield code="z">Southwest, New</subfield>
<subfield code="v">Periodicals.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="0">
<subfield code="a">Archaeology</subfield>
<subfield code="v">Periodicals.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="7">
<subfield code="a">Anthropology.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="7">
<subfield code="a">Antiquities.</subfield>
<subfield code="x">History.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="7">
<subfield code="a">Archaeology.</subfield>
</datafield>
<datafield tag="650" ind1=" " ind2="7">
<subfield code="a">Indians of North America.</subfield>
</datafield>
</record>

XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<p>
<xsl:for-each select="record/datafield[@tag='650']">&#160; &#160; &#160; &#160; &#160; &#160;
<xsl:value-of select="subfield[@code='a']"/>--<xsl:value-of select="subfield[@code='x']"/>--<xsl:value-of select="subfield[@code='z']"/>--<xsl:value-of select="subfield[@code='v']"/>
</xsl:for-each>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

这种工作,但即使子字段不存在,它也会放置连字符,这会让读者感到困惑。

感谢您对此的任何帮助,我非常感谢。我也完成了代码,这可能是(手指交叉)最后一步。然后,我只需要批量编辑要附加到XSL文件的XML文件。

这种工作,但即使<subfield>不存在,它也会放置连字符- 没有条件检查<subfield>@code属性中具有特定值的元素是否存在于输入 XML 中。每个<xsl:value-of>之前的<xsl:if test="">条件都会处理此案。

但是,有不同的方法可以编写 XSLT 代码以生成所需的 HTML 输出。当前的 XSLT 代码将生成一个<p>标记,其中包含我认为不需要的<subfield>元素中的所有值。我认为您需要一个对应于每个<datafield @tag='650'>的单独<p>标签,并为<subfield>子元素提供一个hyphen分隔的值。

为了实现此输出,需要按如下方式更改模板。

<xsl:template match="/">
<html>
<body>
<xsl:for-each select="record/datafield[@tag='650']">
<!-- create <p> tag for every <datafield> -->
<p>
<!-- instead of hardcoding <subfield> elements, loop through
the available <subfield> element having @code attribute -->
<xsl:for-each select="subfield[@code]">
<xsl:value-of select="." />
<!-- if the position of the <subfield> is not last 
append hyphen characters to concatenated string -->
<xsl:if test="position() != last()">
<xsl:text>--</xsl:text>
</xsl:if>
</xsl:for-each>
</p>
</xsl:for-each>
</body>
</html>
</xsl:template>

这将生成如下 HTML

<html>
<body>
<p>Anthropology--Southwest, New--Periodicals.</p>
<p>Indians of North America--Southwest, New--Periodicals.</p>
<p>Archaeology--Periodicals.</p>
<p>Anthropology.</p>
<p>Antiquities.--History.</p>
<p>Archaeology.</p>
<p>Indians of North America.</p>
</body>
</html>

上面的 XSLT 代码只是实现输出的一种方式。可以使用不同的匹配模板重写/修改相同的 XSLT,而不是嵌套<xsl:for-each>或处理特定@code值的模板,即如果只考虑@code = 'a' or 'v' or 'x' or 'z'值并忽略任何其他值。

相关内容

  • 没有找到相关文章

最新更新