gpt4 book ai didi

xslt - 具有动态匹配的xslt调用模板

转载 作者:行者123 更新时间:2023-12-04 13:29:23 25 4
gpt4 key购买 nike

我试图在调用模板以抑制来自xml的节点时暂停动态参数。

我将这个模板称为:

transform employee.xml suppress.xsl ElementsToSuppress=id,fname 

employee.xml
<?xml version="1.0" encoding="utf-8" ?>
<Employees>
<Employee>
<id>1</id>
<firstname>xyz</firstname>
<lastname>abc</lastname>
<age>32</age>
<department>xyz</department>
</Employee>
<Employee>
<id>2</id>
<firstname>XY</firstname>
<lastname>Z</lastname>
<age>21</age>
<department>xyz</department>
</Employee>
</Employees>

抑制文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="2.0" xmlns:elements="http://localhost">

<elements:name abbrev="id">id</elements:name>
<elements:name abbrev="fname">firstname</elements:name>

<xsl:param name="ElementsToSuppress" ></xsl:param>

<xsl:variable name="tokenizedSample" select="tokenize($ElementsToSuppress,',')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
<xsl:for-each select="$tokenizedSample">
<xsl:call-template name ="Suppress" >
<xsl:with-param name="parElementName">
<xsl:value-of select="."/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>

</xsl:template>






<xsl:template name="Suppress">
<xsl:param name="parElementName" select="''"></xsl:param>
<xsl:variable name="extNode" select="document('')/*/elements:name[@abbrev=$parElementName]"/>
<xsl:call-template name="test" >
<xsl:with-param name="parElementName" >
<xsl:value-of select="$extNode"/>
</xsl:with-param>
</xsl:call-template>
</xsl:template>


<xsl:template name="test" match="*[name() = $parElementName]" >
<xsl:param name="parElementName" select="''"></xsl:param>
<xsl:call-template name="SuppressElement" />
</xsl:template>

<xsl:template name="SuppressElement" />

</xsl:stylesheet>

我们可以通过这种方式或其他方式实现输出吗?理想的方法是传递逗号分隔的节点缩写,并在一个调用中取消显示。

任何帮助将不胜感激。

问候,

AB

最佳答案

我不明白为什么参数值“fname”会抑制一个名为“firstname”的元素,但除此之外,您可能只是想要

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">

<xsl:param name="ElementsToSuppress" as="xs:string" select="'id,firstname'"/>
<xsl:variable name="names-to-suppress" as="xs:QName*"
select="for $s in tokenize($ElementsToSuppress, ',') return QName('', $s)"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*, node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[node-name(.) = $names-to-suppress]"/>

</xsl:stylesheet>

[编辑]
我想念您的样本样式表似乎包含这些参数到样本输入中元素名称的映射。在这种情况下,下面是样式表的改编版本以处理这种情况:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:data="http://example.com/data"
xmlns:elements="http://example.com/elements"
exclude-result-prefixes="xs data elements"
version="2.0">

<data:data>
<elements:name abbrev="id">id</elements:name>
<elements:name abbrev="fname">firstname</elements:name>
</data:data>

<xsl:key name="e-by-abbrev" match="elements:name" use="@abbrev"/>

<xsl:param name="ElementsToSuppress" as="xs:string" select="'id,fname'"/>
<xsl:variable name="names-to-suppress" as="xs:QName*"
select="for $s in tokenize($ElementsToSuppress, ',') return QName('', key('e-by-abbrev', $s, document('')/xsl:stylesheet/data:data))"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*, node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[node-name(.) = $names-to-suppress]"/>

</xsl:stylesheet>

[第二次编辑以实现进一步的请求]这是一个示例,还检查了 relationship属性值:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:data="http://example.com/data"
xmlns:elements="http://example.com/elements"
exclude-result-prefixes="xs data elements"
version="2.0">

<xsl:param name="ElementsToSuppress" as="xs:string" select="'id'"/>

<xsl:param name="parVAObjectRelationship" as="xs:string" select="'a,b'"/>

<xsl:variable name="names-to-suppress" as="xs:QName*"
select="for $s in tokenize($ElementsToSuppress, ',') return QName('', key('e-by-abbrev', $s, document('')/xsl:stylesheet/data:data))"/>

<xsl:variable name="att-values-to-suppress" as="xs:string*"
select="tokenize($parVAObjectRelationship, ',')"/>

<data:data>
<elements:name abbrev="id">id</elements:name>
<elements:name abbrev="fname">firstname</elements:name>
</data:data>

<xsl:key name="e-by-abbrev" match="elements:name" use="@abbrev"/>

<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@*, node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="*[@relationship = $att-values-to-suppress]"/>

<xsl:template match="*[node-name(.) = $names-to-suppress]"/>

</xsl:stylesheet>

当应用于
<Employees>
<Employee>
<id>1</id>
<firstname>xyz</firstname>
<lastname relationship="a">abc</lastname>
<age relationship="b">32</age>
<department>xyz</department>
</Employee>
</Employees>

输出是
<Employees>
<Employee>

<firstname>xyz</firstname>


<department>xyz</department>
</Employee>
</Employees>

您可能要添加带状空间并输出indent =“yes”以防止出现空行。

关于xslt - 具有动态匹配的xslt调用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4410900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com