2011-12-18 11 views
2

XSLTで定義されているXMLファイルにテンプレート名を適用する必要のあるアプリケーションがC#で作成されています。XSLTテンプレートを選択

例XML:

<Data> 
    <Person> 
     <Name>bob</Name> 
     <Age>43</Age> 
    </Person> 
    <Thing> 
     <Color>Red</Color> 
    </Thing> 
</Data> 

例XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions"> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:param name="TargetName" /> 
    <xsl:param name="RootPath" /> 

    <xsl:Template Name="AgeGrabber"> 
     <xsl:value-of select="/Person/Age" /> 
    </xsl:Template> 

    <xsl:Template Name="ColorGrabber"> 
     <xsl:value-of select="/Color" /> 
    </xsl:Template> 

</xsl:stylesheet> 

は、私はパス "/データ/シング" と "ColorGrabberに" テンプレートを実行したかったし、別のテンプレートを使用して変換を実行言います"AgeGrabber"とパス "/ Data"。これは可能ですか?私はパスとテンプレート名を渡すことができたと思っていましたが(上の2つのパラメータを集めて)、いくつかのタイプのスイッチを行いますが、xslのように見えます:call-templateはname属性としてパラメータを取ることができません。

どうすればこの問題を解決できますか?

+1

変換の予想される出力はどのくらいですか? – mzjn

答えて

1

この質問と多くの問題があります。

  1. <xsl:stylesheet version="2.0" ...が指定されている、しかし、現時点では> NETは、ネイティブXSLT 2.0をサポートしていません。単一のXMLドキュメントの両方/Person/Age/Color要素を含めることができないため

  2. Thecode例では、あまりにも意味がありません - 整形式XML文書は、単一のトップ要素を有し、それはPerson又はColor、両方ではなくいずれかであり得ます。

より意味の例があった場合:

<Person> 
<Age>27</Age> 
<HairColor>blond</HairColor> 
</Person> 

は、一つの単純な解決策はある:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="pProperty" select="'Age'"/> 

<xsl:template match="/"> 
    <xsl:value-of select="/*/*[name()=$pProperty]"/> 
</xsl:template> 
</xsl:stylesheet> 

この変換は、上記のXML文書に適用されます希望の結果が得られます。

27 

場合、関心の要素のnestednessは任意であり、および/または、我々は異なる要素に異なる処理を実行する必要があり、その後、適切な解決策は、(ものの名前ではない)一致テンプレートを使用することです:この変換は、同じXML文書(上記)に印加さ​​れる

<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="pProperty" select="'HairColor'"/> 

<xsl:template match="Age"> 
    <xsl:if test="$pProperty = 'Age'"> 
    This person is <xsl:value-of select="."/> old. 
    </xsl:if> 
</xsl:template> 

<xsl:template match="HairColor"> 
    <xsl:if test="$pProperty = 'HairColor'"> 
    This person has <xsl:value-of select="."/> hair. 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

は、再度正しい結果が製造される:

This person has blond hair. 
最後

、あなたは本当に、XSLT 1.0またはXSLT 2.0で高階関数(HOF)をシミュレートし、この答えを見たい場合:https://stackoverflow.com/a/8363249/36305を、または約FXSLを学びます。

0

はるかに簡単: - あなたは後方にそれを得た/ /人/年齢または/ /シング/色

0

(年齢と色の要素のために)2適用-テンプレートルールを作成し、条件付きで変換するために、適切なノードを送ります。あなたは、使用したいノードに合ったテンプレートを作成する必要があります。

<xsl:stylesheet> 
    <xsl:template match="Person|Thing"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="Person"> 
     <xsl:value-of select="Age" /> 
    </xsl:template> 

    <xsl:template match="Thing"> 
     <xsl:value-of select="Color" /> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題