gpt4 book ai didi

xml - 在给定输入 XML 的情况下,如何使 XSL 产生以下结果

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

我已经尝试了几件事...使用变量和模板,但进展缓慢。但我只是没有让它工作 - 我的上下文有问题。

输入...

  • 表“700”可以包含多个条目。
  • Subject1、Subject2、Subject3 的值为 English、Math、Science(但顺序可能因源 XML 而异)
  • 分数与主题有位置关系(即 Score1 用于主题 1)

输出...

  • 将始终包含 6 个节点(ENGLISH、MATH、SCIENCE、Class、Class2、Class3)
  • Subject_ 标签的顺序必须始终是英语、数学,然后是科学。
  • Subject_ 标签将大写
  • 如果相应分数 > 0,则 Subject_ 标签将包含标记 1;否则 0
  • Class_Score 标签的顺序始终需要是英语、数学,然后是科学。

我破坏了我的代码,下面的代码可能无法完全发挥作用,但可以让我了解我的尝试。

我的第一个问题是 - 我走在正确的轨道上吗?

  • 通过 Subject to Grades 模板
  • 捕获主题的“索引”
  • 将主题和索引传递给 add-Grades-nodes 模板

这是我的上下文问题阻止我的地方。

-- 我的输入 XML --

<?xml version="1.0"?>
<Account Number="123456">
<Data>
<Table ID="700">
<Record ID="1" SubClass="Person">
<Name.Last>Smith</Name.Last>
<Name.First>John</Name.First>
<Score1>50</Score1>
<Score2>75</Score2>
<Score3>100</Score3>
<Subject1>Math</Subject1>
<Subject2>English</Subject2>
<Subject3>Science</Subject3>
</Record>
<Record ID="2" SubClass="Person">
<Name.Last>Smith</Name.Last>
<Name.First>Jane</Name.First>
<Score1></Score1>
<Score2>77</Score2>
<Score3>80</Score3>
<Subject1>Math</Subject1>
<Subject2>English</Subject2>
<Subject3>Science</Subject3>
</Record>
</Table>
</Data>
</Account>

-- 期望的输出 XML --

<Out>
<Subject_ENGLISH>1</Subject_ENGLISH>
<Subject_MATH>1</Subject_MATH>
<Subject_SCIENCE>1</Subject_SCIENCE>
<Class_SCORE>75</Class_SCORE>
<Class2_SCORE>50</Class2_SCORE>
<Class3_SCORE>100</Class3_SCORE>
<Subject_ENGLISH>0</Subject_ENGLISH>
<Subject_MATH>1</Subject_MATH>
<Subject_SCIENCE>1</Subject_SCIENCE>
<Class_SCORE></Class_SCORE>
<Class2_SCORE>77</Class2_SCORE>
<Class3_SCORE>80</Class3_SCORE>
</Out>

-- 当前不工作的 XSLT --

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" version="1.0">
<xsl:output method="xml" encoding="UTF-8"/>

<xsl:template match="Account">
<Out>
<xsl:for-each select="/Account/Data/Table[@ID='700']/Record[@SubClass='Person']>

<xsl:call-template name="Grades">
<xsl:with-param name="Subject">English</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="Grades">
<xsl:with-param name="Subject">Math</xsl:with-param>
</xsl:call-template>
<xsl:call-template name="Grades">
<xsl:with-param name="Subject">Science</xsl:with-param>
</xsl:call-template>


</xsl:for-each>
</Out>
</xsl:template>


<xsl:template name="Grades">
<xsl:param name="Subject"/>

<xsl:for-each select="*[starts-with(name(), 'Subject')][node()=$Subject]">

<xsl:variable name='cr-index'>
<xsl:value-of select ='substring(name(), string-length(name()))'/>
</xsl:variable>

<xsl:call-template name="create-Grades-nodes">
<xsl:with-param name="cr-context" select =".."/>
<xsl:with-param name="Subject">
<xsl:value-of select='$Subject' />
</xsl:with-param>
<xsl:with-param name="cr-index">
<xsl:value-of select='$cr-index'/>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</xsl:template>

<xsl:template name="create-Grades-nodes" match="$cr-context" >
<xsl:param name ="cr-context"/>
<xsl:param name ="Subject"/>
<xsl:param name ="cr-index"/>

<xsl:variable name='cr-score'>
<xsl:value-of select='name($cr-context)/concat("Score", $cr-index)'/>
</xsl:variable>

<xsl:variable name="smallcase" select="'abcdefghijklmnopqrstuvwxyz'" />
<xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'" />

<xsl:element name='{concat("Subject_", translate($Subject, $smallcase, $uppercase))}'>
<xsl:choose>
<xsl:when test= '$cr-score &gt; 0'>
<xsl:value-of select = "1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select = "0"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>

</xsl:template>
</xsl:stylesheet>

最佳答案

这个转换:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="pSubjects">
<s name="English" at="1"/>
<s name="Math" at="2"/>
<s name="Science" at="3"/>
</xsl:param>

<xsl:variable name="vSubjects" select=
"document('')/*/xsl:param[@name='pSubjects']/*"/>

<xsl:variable name="vLower" select=
"'abcdefghijklmnopqrstuvwxyz'"/>

<xsl:variable name="vUpper" select=
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

<xsl:template match="/*">
<Out>
<xsl:apply-templates/>
</Out>
</xsl:template>

<xsl:template match="Table[@ID='700']/Record">
<xsl:apply-templates select="*[starts-with(name(), 'Su')]">
<xsl:sort select="$vSubjects[@name = current()]/@at" data-type="number"/>
</xsl:apply-templates>

<xsl:apply-templates select="*[starts-with(name(), 'Sc')]">
<xsl:sort select=
"$vSubjects[@name
= current()/../*[starts-with(name(), 'Su')]
[substring-after(name(), 'Subject')
=
substring-after(name(current()), 'Score')
]
]/@at"
data-type="number"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="*[starts-with(name(), 'Su')]">
<xsl:variable name="vgenName" select=
"concat('Subject_',
translate(., $vLower, $vUpper)
)"/>
<xsl:element name="{$vgenName}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>

<xsl:template match="*[starts-with(name(), 'Sc')]">
<xsl:variable name="vInd" select=
"$vSubjects[@name
= current()/../*[starts-with(name(), 'Su')]
[substring-after(name(), 'Subject')
=
substring-after(name(current()), 'Score')
]
]/@at"/>

<xsl:variable name="vgenName" select=
"concat('Class',
translate($vInd, '1', ''),
'_SCORE'
)
"/>
<xsl:element name="{$vgenName}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<Account Number="123456">
<Data>
<Table ID="700">
<Record ID="1" SubClass="Person">
<Name.Last>Smith</Name.Last>
<Name.First>John</Name.First>
<Score1>50</Score1>
<Score2>75</Score2>
<Score3>100</Score3>
<Subject1>Math</Subject1>
<Subject2>English</Subject2>
<Subject3>Science</Subject3>
</Record>
<Record ID="2" SubClass="Person">
<Name.Last>Smith</Name.Last>
<Name.First>Jane</Name.First>
<Score1></Score1>
<Score2>77</Score2>
<Score3>80</Score3>
<Subject1>Math</Subject1>
<Subject2>English</Subject2>
<Subject3>Science</Subject3>
</Record>
</Table>
</Data>
</Account>

产生想要的、正确的结果:

<Out>
<Subject_ENGLISH>English</Subject_ENGLISH>
<Subject_MATH>Math</Subject_MATH>
<Subject_SCIENCE>Science</Subject_SCIENCE>
<Class_SCORE>75</Class_SCORE>
<Class2_SCORE>50</Class2_SCORE>
<Class3_SCORE>100</Class3_SCORE>
<Subject_ENGLISH>English</Subject_ENGLISH>
<Subject_MATH>Math</Subject_MATH>
<Subject_SCIENCE>Science</Subject_SCIENCE>
<Class_SCORE>77</Class_SCORE>
<Class2_SCORE></Class2_SCORE>
<Class3_SCORE>80</Class3_SCORE>
</Out>

关于xml - 在给定输入 XML 的情况下,如何使 XSL 产生以下结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823008/

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