XSLT 转换:根据条件将多个标签合并为单个标签
XSLT Transformation: Combine multiple tags into single tag based on a condition
我在一个节点中有多个标签,我不想根据条件将它们组合成一个标签。
每个人都会依次拥有多个JobInfo标签,后面跟着多个EmpInfo。仅当 'Applying' 指标为 'Y' 时,我想将第一个 JobInfo 与第一个 EmpInfo 以及第二个 JobInfo 与第二个 EmpInfo 合并,并将它们转换为 EmpJobInfo 标签。
<soap:Envelope xmlns:soap="schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<App>
<person>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>1200</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>Y</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>800</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>Y</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>450</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>N</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Walmart</value>
</entry>
</answers>
<key>EmpInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Target</value>
</entry>
</answers>
<key>EmpInfo</key>
</answerSet>
</person>
</App>
</soap:Body>
</soap:Envelope>
我目前正在使用下面的 XSLT,它将获取每个标签的位置并与其他标签结合。但它不会检查 'Applying' 是否为 'Y'。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="*">
<App>
<xsl:for-each select="//person">
<xsl:variable name ="person" select="." />
<person>
<xsl:for-each select="answerSet[key='EmpInfo']">
<xsl:variable name ="pos" select="position()" />
<answerSet>
<xsl:copy-of select="answers" />
<xsl:copy-of select="$person/answerSet[key='JobInfo'][$pos]/answers" />
<key>EmpJobInfo</key>
</answerSet>
</xsl:for-each>
</person>
</xsl:for-each>
</App>
</xsl:template>
</xsl:stylesheet>
预期输出为
<App>
<person>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Walmart</value>
</entry>
</answers>
<answers>
<entry>
<key>monthlyIncome</key>
<value>1200</value>
</entry>
</answers>
<key>EmpJobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Target</value>
</entry>
</answers>
<answers>
<entry>
<key>monthlyIncome</key>
<value>800</value>
</entry>
</answers>
<key>EmpJobInfo</key>
</answerSet>
</person>
</App>
如果您只想处理符合条件的元素,那么我想将模板更改为
<xsl:template match="App">
<App>
<xsl:for-each select="//person">
<xsl:variable name ="person" select="." />
<person>
<xsl:for-each select="answerSet[key='JobInfo'][answers/entry[key = 'Applying']/value = 'Y']">
<xsl:variable name ="pos" select="position()" />
<answerSet>
<xsl:copy-of select="$person/answerSet[key='EmpInfo'][$pos]/answers" />
<xsl:copy-of select="answers[not(entry[key = 'Applying']/value = 'Y')]" />
<key>EmpJobInfo</key>
</answerSet>
</xsl:for-each>
</person>
</xsl:for-each>
</App>
</xsl:template>
应该执行该条件。
我在一个节点中有多个标签,我不想根据条件将它们组合成一个标签。
每个人都会依次拥有多个JobInfo标签,后面跟着多个EmpInfo。仅当 'Applying' 指标为 'Y' 时,我想将第一个 JobInfo 与第一个 EmpInfo 以及第二个 JobInfo 与第二个 EmpInfo 合并,并将它们转换为 EmpJobInfo 标签。
<soap:Envelope xmlns:soap="schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<App>
<person>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>1200</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>Y</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>800</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>Y</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>monthlyIncome</key>
<value>450</value>
</entry>
</answers>
<answers>
<entry>
<key>Applying</key>
<value>N</value>
</entry>
</answers>
<key>JobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Walmart</value>
</entry>
</answers>
<key>EmpInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Target</value>
</entry>
</answers>
<key>EmpInfo</key>
</answerSet>
</person>
</App>
</soap:Body>
</soap:Envelope>
我目前正在使用下面的 XSLT,它将获取每个标签的位置并与其他标签结合。但它不会检查 'Applying' 是否为 'Y'。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="*">
<App>
<xsl:for-each select="//person">
<xsl:variable name ="person" select="." />
<person>
<xsl:for-each select="answerSet[key='EmpInfo']">
<xsl:variable name ="pos" select="position()" />
<answerSet>
<xsl:copy-of select="answers" />
<xsl:copy-of select="$person/answerSet[key='JobInfo'][$pos]/answers" />
<key>EmpJobInfo</key>
</answerSet>
</xsl:for-each>
</person>
</xsl:for-each>
</App>
</xsl:template>
</xsl:stylesheet>
预期输出为
<App>
<person>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Walmart</value>
</entry>
</answers>
<answers>
<entry>
<key>monthlyIncome</key>
<value>1200</value>
</entry>
</answers>
<key>EmpJobInfo</key>
</answerSet>
<answerSet>
<answers>
<entry>
<key>EmpName</key>
<value>Target</value>
</entry>
</answers>
<answers>
<entry>
<key>monthlyIncome</key>
<value>800</value>
</entry>
</answers>
<key>EmpJobInfo</key>
</answerSet>
</person>
</App>
如果您只想处理符合条件的元素,那么我想将模板更改为
<xsl:template match="App">
<App>
<xsl:for-each select="//person">
<xsl:variable name ="person" select="." />
<person>
<xsl:for-each select="answerSet[key='JobInfo'][answers/entry[key = 'Applying']/value = 'Y']">
<xsl:variable name ="pos" select="position()" />
<answerSet>
<xsl:copy-of select="$person/answerSet[key='EmpInfo'][$pos]/answers" />
<xsl:copy-of select="answers[not(entry[key = 'Applying']/value = 'Y')]" />
<key>EmpJobInfo</key>
</answerSet>
</xsl:for-each>
</person>
</xsl:for-each>
</App>
</xsl:template>
应该执行该条件。