gpt4 book ai didi

xml - XSLT 外部文档查找

转载 作者:数据小太阳 更新时间:2023-10-29 02:54:05 24 4
gpt4 key购买 nike

我有一个 file.xml

<?xml version="1.0"?>
<Report>
<row>
<field1>test1</field1>
<field2>test2</field2>
<field3>test3</field3>
</row>
<row>
<field1>test4</field1>
<field2>test5</field2>
<field3>test6</field3>
</row>
</Report>

还有一个 lookup.xml

<?xml version="1.0"?>
<lookup>
<field1>fieldA</field1>
<field2>fieldB</field2>
<field3>fieldC</field3>
</lookup>

我正在尝试获得以下输出

<?xml version="1.0"?>
<Report>
<row>
<fieldA>test1</fieldA>
<fieldB>test2</fieldB>
<fieldC>test3</fieldC>
</row>
<row>
<fieldA>test4</fieldA>
<fieldB>test5</fieldB>
<fieldC>test6</fieldC>
</row>
</Report>

到目前为止,我想出了以下 transform.xsl

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>



<xsl:variable name="lookupDoc" select="document('lookup.xml')"/>

<xsl:template match="Report">
<Items>
<xsl:apply-templates/>
</Items>
</xsl:template>

<xsl:template match="row">
<Item>
<xsl:apply-templates/>
</Item>
</xsl:template>

<xsl:template match="row/*">
<xsl:variable name="this" select="."/>
<xsl:variable name="lookup">
<xsl:for-each select="$lookupDoc">
<xsl:key name="k1" match="local-name()" use="text()"/>
<xsl:value-of select="key('k1', local-name($this))"/>
</xsl:for-each>
</xsl:variable>
<fieldName name="{$lookup}">
<xsl:value-of select="."/>
</fieldName>
</xsl:template>

</xsl:stylesheet>

Xsl 的新手因此不确定为什么会出现编译错误

最佳答案

看起来您的想法是正确的(而且是一个新颖的想法),但有些地方需要修复。请试试这个:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="1.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="k1" match="*" use="local-name()"/>

<xsl:variable name="lookupDoc" select="document('lookup.xml')"/>

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

<xsl:template match="row/*">
<xsl:variable name="newName">
<xsl:apply-templates select="$lookupDoc/lookup">
<xsl:with-param name="nameToMatch" select="local-name()" />
</xsl:apply-templates>
</xsl:variable>
<xsl:element name="{$newName}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="lookup">
<xsl:param name="nameToMatch" />
<xsl:value-of select="string(key('k1', $nameToMatch))"/>
</xsl:template>
</xsl:stylesheet>

为了让 key()$lookupDoc DOM 中定位值,需要在上下文中使用 key()那个 DOM,这就是最后一个模板的用途。当它在您的示例输入上运行时,结果就是您请求的输出:

<Report>
<row>
<fieldA>test1</fieldA>
<fieldB>test2</fieldB>
<fieldC>test3</fieldC>
</row>
<row>
<fieldA>test4</fieldA>
<fieldB>test5</fieldB>
<fieldC>test6</fieldC>
</row>
</Report>

通过一些修改,也可以使用您尝试使用的 for-each 方法,因为这是进入 $lookupDoc 的另一种方法DOM。下面的 XSLT 应该与上面的结果相同,并且更类似于您最初的尝试:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>

<xsl:key name="k1" match="*" use="local-name()"/>

<xsl:variable name="lookupDoc" select="document('lookup.xml')"/>

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

<xsl:template match="row/*">
<xsl:variable name="this" select="." />
<xsl:variable name="lookup">
<xsl:for-each select="$lookupDoc">
<xsl:value-of select="key('k1', local-name($this))"/>
</xsl:for-each>
</xsl:variable>
<xsl:element name="{$lookup}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

</xsl:stylesheet>

关于xml - XSLT 外部文档查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576071/

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