XSL:更改 parent 元素属性具有特定值的元素的属性值
XSL: change attribute value of an element whose parent element attribute has a specific value
我想修改 Tableau 使用 XSL 转换创建的 XML 文件。
我需要的是仅当 parent 元素具有值时更改 calculation 元素的 formula 值标题 属性中的“ifShow”。
我的 XML 的形式是:
<?xml version='1.0' encoding='utf-8' ?>
<!-- build 20212.21.1112.1433 -->
<workbook source-build='2021.2.5 (20212.21.1112.1433)' source-platform='win' version='18.1' xml:base='https://tableau.company.com' xmlns:user='http://www.tableausoftware.com/xml/user'>
<datasources>
<datasource caption='V_Tableau_CommercialLayer' inline='true' name='sqlproxy' version='18.1'>
<column caption='Month' datatype='string' name='[Calculation_36]' role='dimension' type='nominal'>
<calculation class='tableau' formula='no change' />
</column>
<column caption='ifShow' datatype='string' name='[Calculation_40]' role='dimension' type='nominal'>
<calculation class='tableau' formula='old code' />
</column>
</datasource>
</datasources>
</workbook>
期望的输出:
<?xml version='1.0' encoding='utf-8' ?>
<!-- build 20212.21.1112.1433 -->
<workbook source-build='2021.2.5 (20212.21.1112.1433)' source-platform='win' version='18.1' xml:base='https://tableau.company.com' xmlns:user='http://www.tableausoftware.com/xml/user'>
<datasources>
<datasource caption='V_Tableau_CommercialLayer' inline='true' name='sqlproxy' version='18.1'>
<column caption='Month' datatype='string' name='[Calculation_36]' role='dimension' type='nominal'>
<calculation class='tableau' formula='no change' />
</column>
<column caption='ifShow' datatype='string' name='[Calculation_40]' role='dimension' type='nominal'>
<calculation class='tableau' formula='new code' />
</column>
</datasource>
</datasources>
</workbook>
我使用的 XSL 是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="pNewFormula" select="'new code'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="column/@caption[. ='ifShow']/calculation">
<xsl:attribute name="formula">
<xsl:value-of select="$pNewFormula"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
但是,这不起作用,我不知道如何访问元素 column
的 child 节点
非常感谢您的支持!
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNewFormula" select="'new code'"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="column[@caption='ifShow']/calculation/@formula">
<xsl:attribute name="formula">
<xsl:value-of select="$pNewFormula"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我想修改 Tableau 使用 XSL 转换创建的 XML 文件。
我需要的是仅当 parent 元素具有值时更改 calculation 元素的 formula 值标题 属性中的“ifShow”。
我的 XML 的形式是:
<?xml version='1.0' encoding='utf-8' ?>
<!-- build 20212.21.1112.1433 -->
<workbook source-build='2021.2.5 (20212.21.1112.1433)' source-platform='win' version='18.1' xml:base='https://tableau.company.com' xmlns:user='http://www.tableausoftware.com/xml/user'>
<datasources>
<datasource caption='V_Tableau_CommercialLayer' inline='true' name='sqlproxy' version='18.1'>
<column caption='Month' datatype='string' name='[Calculation_36]' role='dimension' type='nominal'>
<calculation class='tableau' formula='no change' />
</column>
<column caption='ifShow' datatype='string' name='[Calculation_40]' role='dimension' type='nominal'>
<calculation class='tableau' formula='old code' />
</column>
</datasource>
</datasources>
</workbook>
期望的输出:
<?xml version='1.0' encoding='utf-8' ?>
<!-- build 20212.21.1112.1433 -->
<workbook source-build='2021.2.5 (20212.21.1112.1433)' source-platform='win' version='18.1' xml:base='https://tableau.company.com' xmlns:user='http://www.tableausoftware.com/xml/user'>
<datasources>
<datasource caption='V_Tableau_CommercialLayer' inline='true' name='sqlproxy' version='18.1'>
<column caption='Month' datatype='string' name='[Calculation_36]' role='dimension' type='nominal'>
<calculation class='tableau' formula='no change' />
</column>
<column caption='ifShow' datatype='string' name='[Calculation_40]' role='dimension' type='nominal'>
<calculation class='tableau' formula='new code' />
</column>
</datasource>
</datasources>
</workbook>
我使用的 XSL 是:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="pNewFormula" select="'new code'"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="column/@caption[. ='ifShow']/calculation">
<xsl:attribute name="formula">
<xsl:value-of select="$pNewFormula"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>
但是,这不起作用,我不知道如何访问元素 column
的 child 节点非常感谢您的支持!
怎么样:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pNewFormula" select="'new code'"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="column[@caption='ifShow']/calculation/@formula">
<xsl:attribute name="formula">
<xsl:value-of select="$pNewFormula"/>
</xsl:attribute>
</xsl:template>
</xsl:stylesheet>