将 xslt2.0 转换为 xslt1.0 语法
convert xslt2.0 to xslt1.0 syntax
我是 XSLT 的新手,我从我的团队那里了解到,我们目前的 xml 解析器仅支持 1.0 版。我在这里需要帮助才能将我当前的 xslt 2.0 代码转换为 1.0
版
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Root">
<!-- header -->
<xsl:text>id|parent_id</xsl:text>
<xsl:value-of select="$newline"/>
<!-- data -->
<xsl:for-each select="Package">
<xsl:variable name="b-id" select="Business_ID" />
<!-- TPFC data -->
<xsl:for-each select="TPFC">
<xsl:variable name="total_level" select="count(.//.//Parent)+1"/>
<xsl:call-template name="prod-family">
<xsl:with-param name="total_level" select="$total_level"/>
<xsl:with-param name="b_id" select="$b-id"/>
</xsl:call-template>
<xsl:for-each select="//Parent">
<!-----Question 2------->
<xsl:call-template name="prod-family">
<xsl:with-param name="total_level" select="$total_level"/>
<xsl:with-param name="b_id" select="$b-id"/>
</xsl:call-template>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<!-----Question 1------->
<xsl:template name="prod-family">
<xsl:param name="total_level"/>
<xsl:param name="b_id"/>
<xsl:value-of select="reverse(.//Parent/Name), translate(Name,' ','')" separator="_" />
<xsl:value-of select="$separator"/>
<xsl:value-of select="reverse(.//Parent/Name)" separator="_" />
<xsl:value-of select="$separator"/>
<xsl:value-of select="$newline"/>
</xsl:template>
XML以上为
<?xml version="1.0" encoding="UTF-8"?>
<Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Package ID="1122" BusinessID="001233" Version="19.0.2" xsi:type="Doms">
<Name>ABC</Name>
<Description> Desc sample</Description>
<Category>54</Category>
<Business_ID>001233</Business_ID>
<TPFC ID="76" xsi:type="TPFC" Pattern="Th_Branch">
<Name>AM</Name>
<Parent ID="11d" xsi:type="TPFC" Pattern="Th_Branch">
<Description>Mob1</Description>
<Name>Mob1</Name>
<Parent ID="12F" xsi:type="TPFC" Pattern="Th_Branch">
<Description>Mob2</Description>
<Name>Mob2</Name>
</Parent>
</Parent>
</TPFC>
</Package>
</Root>
这是结果
| id | parent_id |
| Mob2_Mob1_AM | Mob2_Mob1 |
| Mob2_Mob1 | Mob2 |
| Mob2 | |
在上面的示例中,我在两个地方使用 XSLT 2.0 实现了连接(检查模板 - prod-family),其中
id - 在下面的示例中将所有名称从其根父级连接到当前名称,它将是 Mob2_Mob1_AM
parent_id - 从其根父项
连接所有父项名称
- 任何人都可以帮助我在上述两种情况下如何在 XSLT 1.0 版本中使用 for-each 实现 concat
- XSLT 1.0 是否也支持调用模板和参数?
快速浏览一下,这里仅有的 2.0 构造是对 reverse()
的调用和 xsl:value-of/@separator
的使用。这些是一起使用的。您应该能够执行以下操作:
<xsl:for-each select=".//Parent/Name | ./Name">
<xsl:sort select="-position()"/>
<xsl:value-of select="."/>
<xsl:if test="position() != last()">_</xsl:if>
</xsl:for-each>
我是 XSLT 的新手,我从我的团队那里了解到,我们目前的 xml 解析器仅支持 1.0 版。我在这里需要帮助才能将我当前的 xslt 2.0 代码转换为 1.0
版 <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Root">
<!-- header -->
<xsl:text>id|parent_id</xsl:text>
<xsl:value-of select="$newline"/>
<!-- data -->
<xsl:for-each select="Package">
<xsl:variable name="b-id" select="Business_ID" />
<!-- TPFC data -->
<xsl:for-each select="TPFC">
<xsl:variable name="total_level" select="count(.//.//Parent)+1"/>
<xsl:call-template name="prod-family">
<xsl:with-param name="total_level" select="$total_level"/>
<xsl:with-param name="b_id" select="$b-id"/>
</xsl:call-template>
<xsl:for-each select="//Parent">
<!-----Question 2------->
<xsl:call-template name="prod-family">
<xsl:with-param name="total_level" select="$total_level"/>
<xsl:with-param name="b_id" select="$b-id"/>
</xsl:call-template>
</xsl:for-each>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
<!-----Question 1------->
<xsl:template name="prod-family">
<xsl:param name="total_level"/>
<xsl:param name="b_id"/>
<xsl:value-of select="reverse(.//Parent/Name), translate(Name,' ','')" separator="_" />
<xsl:value-of select="$separator"/>
<xsl:value-of select="reverse(.//Parent/Name)" separator="_" />
<xsl:value-of select="$separator"/>
<xsl:value-of select="$newline"/>
</xsl:template>
XML以上为
<?xml version="1.0" encoding="UTF-8"?>
<Root
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Package ID="1122" BusinessID="001233" Version="19.0.2" xsi:type="Doms">
<Name>ABC</Name>
<Description> Desc sample</Description>
<Category>54</Category>
<Business_ID>001233</Business_ID>
<TPFC ID="76" xsi:type="TPFC" Pattern="Th_Branch">
<Name>AM</Name>
<Parent ID="11d" xsi:type="TPFC" Pattern="Th_Branch">
<Description>Mob1</Description>
<Name>Mob1</Name>
<Parent ID="12F" xsi:type="TPFC" Pattern="Th_Branch">
<Description>Mob2</Description>
<Name>Mob2</Name>
</Parent>
</Parent>
</TPFC>
</Package>
</Root>
这是结果
| id | parent_id |
| Mob2_Mob1_AM | Mob2_Mob1 |
| Mob2_Mob1 | Mob2 |
| Mob2 | |
在上面的示例中,我在两个地方使用 XSLT 2.0 实现了连接(检查模板 - prod-family),其中
id - 在下面的示例中将所有名称从其根父级连接到当前名称,它将是 Mob2_Mob1_AM parent_id - 从其根父项
连接所有父项名称- 任何人都可以帮助我在上述两种情况下如何在 XSLT 1.0 版本中使用 for-each 实现 concat
- XSLT 1.0 是否也支持调用模板和参数?
快速浏览一下,这里仅有的 2.0 构造是对 reverse()
的调用和 xsl:value-of/@separator
的使用。这些是一起使用的。您应该能够执行以下操作:
<xsl:for-each select=".//Parent/Name | ./Name">
<xsl:sort select="-position()"/>
<xsl:value-of select="."/>
<xsl:if test="position() != last()">_</xsl:if>
</xsl:for-each>