在不同节点级别应用模板
Applying template on differents node's level
我尝试修改所有包含特定字符串的节点的QName:
和 return 新的 没有.
(例如我有 <RandomName>
并且想要渲染 <Name>
)
我有一个 xsl:template
用于第一级节点,但找不到如何将其应用到较低级别。
例如XML 来源
在这里我想删除所有的“默认”
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<DefaultID>XXXXXXX</DefaultID>
<DefaultType>Random</DefaultType>
<DefaultCustomer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslt Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</DefaultCustomer>
</Object>
预期结果
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<ID>XXXXXXX</ID>
<Name>John Doe</tName>
<Address>33th Whitecaslt Blvd.</Address>
<Number>+XX X XX XX XX XX</Number>
</Customer>
</Object>
我的 XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:if test="string-length(.)>0">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="//*[contains(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:copy select=".">
<xsl:apply-templates match="//*[contains(name(), 'Default')]" />
</xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我有什么
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslte Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</Customer>
</Object>
如您所见,模板与第二个节点的级别不匹配。
我想我的问题出在我的 <xsl:copy select='.'>
中的 XPath
的范围内(顺便说一句,这似乎没用)?或者也许在这里,<xsl:copy>
不是最佳选择(与 <xsl:copy-of>
相同的结果)?
你想多了。简单地尝试:
<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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我尝试修改所有包含特定字符串的节点的QName: 和 return 新的 没有.
(例如我有 <RandomName>
并且想要渲染 <Name>
)
我有一个 xsl:template
用于第一级节点,但找不到如何将其应用到较低级别。
例如XML 来源
在这里我想删除所有的“默认”<?xml version="1.0" encoding="UTF-8"?>
<Object>
<DefaultID>XXXXXXX</DefaultID>
<DefaultType>Random</DefaultType>
<DefaultCustomer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslt Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</DefaultCustomer>
</Object>
预期结果
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<ID>XXXXXXX</ID>
<Name>John Doe</tName>
<Address>33th Whitecaslt Blvd.</Address>
<Number>+XX X XX XX XX XX</Number>
</Customer>
</Object>
我的 XSL
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:if test="string-length(.)>0">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:if>
</xsl:template>
<xsl:template match="//*[contains(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:copy select=".">
<xsl:apply-templates match="//*[contains(name(), 'Default')]" />
</xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
我有什么
<?xml version="1.0" encoding="UTF-8"?>
<Object>
<ID>XXXXXXX</ID>
<Type>Random</Type>
<Customer>
<DefaultID>XXXXXXX</DefaultID>
<DefaultName>John Doe</DefaultName>
<DefaultAddress>33th Whitecaslte Blvd.</DefaultAddress>
<DefaultNumber>+XX X XX XX XX XX</DefaultNumber>
</Customer>
</Object>
如您所见,模板与第二个节点的级别不匹配。
我想我的问题出在我的 <xsl:copy select='.'>
中的 XPath
的范围内(顺便说一句,这似乎没用)?或者也许在这里,<xsl:copy>
不是最佳选择(与 <xsl:copy-of>
相同的结果)?
你想多了。简单地尝试:
<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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[starts-with(name(), 'Default')]">
<xsl:element name="{substring-after(name(), 'Default')}">
<xsl:apply-templates select="@*|node()"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>